home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / tools / czesc_3 / run68017 / run68017.s < prev    next >
Text File  |  1993-01-10  |  83KB  |  4,248 lines

  1. ;
  2. ;Source of Run68017 . CopyWrite © Kamran Karimi.
  3. ;
  4. ;emulates 30.5 (!) 68020 instructions.
  5. ;
  6. ;Instructions: bra.l, extb.l, cas, pack, unpk, link.l, movec, rtd, moves,
  7. ;              move ccr,<ea>, trapcc, mulu.l, muls.l, divu.l, divs.l,
  8. ;              divul.l, divsl.l, cas2, chk.l, chk2, cmp2, bsr.l, bfchg
  9. ;              bftst, bfset, bfclr, bfextu, bfexts, bfffo, bfins,
  10. ;          (!) bcc.l (bcc.l is emulated only if branch is taken!)
  11. ;
  12. ;Only the emulated instructions can use new 68020 addressing modes.
  13. ;
  14. ;Assembled with AssemPro (Profimat) assembler using an standard A500.
  15. ;Refer to Run68017.ReadMe for more information.
  16.  
  17.  
  18.  
  19. ExecBase    equ 4
  20.  
  21. ;Exec:
  22. AllocMem    equ -198
  23. FreeMem     equ -210
  24. OpenLib     equ -408
  25. CloseLib    equ -414
  26. GetMsg      equ -372
  27. AllocSignal equ -330
  28. FindPort    equ -390
  29. AddPort     equ -354
  30. WaitPort    equ -384
  31. RemPort     equ -360
  32. FindTask    equ -294
  33. Forbid      equ -132
  34. Permit      equ -138
  35.  
  36. ;Intuition:
  37. AutoRequest equ -348
  38. PrintIText  equ -216
  39. OpenWindow  equ -204
  40. CloseWindow equ -72
  41.  
  42. ;DOS:
  43. Delay       equ -198
  44.  
  45.  
  46.   CODE
  47.  
  48.  moveq   #0,d6          ;flag to see if command line entered
  49.  movem.l d0/a0,-(a7)       ;save command line parameters
  50.  move.l  ExecBase,a6
  51.  movea.l #0,a1
  52.  jsr     FindTask(a6)
  53.  move.l  d0,a4
  54.  tst.l   $ac(a4)        ;WorkBench or CLI?
  55.  bne     FromCLI
  56.  lea     $5c(a4),a0
  57.  jsr     WaitPort(a6)
  58.  lea     $5c(a4),a0
  59.  jsr     GetMsg(a6)       ;Get startup message,but we don't use it
  60.  bra     StackAdjust
  61. FromCLI:
  62.  movem.l (a7)+,d0/a0   ;command line parameters
  63.  subq    #1,d0
  64.  beq     NoParam
  65. LoopParam1:
  66.  cmpi.b  #' ',(a0)+
  67.  bne     FoundP
  68.  dbra    d0,LoopParam1
  69.  bra     NoParam
  70. FoundP:
  71.  suba.l  #1,a0
  72.  cmpi.b  #'6',(a0)
  73.  bne     No68k
  74.  adda.l  #1,a0
  75.  cmpi.b  #'8',(a0)+
  76.  bne     NoParam
  77.  cmpi.b  #'k',(a0)
  78.  beq     FoundK
  79.  cmpi.b  #'K',(a0)
  80.  bne     NoParam
  81. FoundK:
  82.  adda.l  #1,a0
  83.  cmpi.b  #' ',(a0)    ;any thing after '68k'?
  84.  beq     Found68
  85.  cmp.b   #10,(a0)
  86.  bne     NoParam
  87. Found68:
  88.  moveq   #1,d6        ;the command was 68k, go on.
  89.  bra     NoParam
  90. No68k:
  91.  cmpi.b  #'q',(a0)
  92.  beq     Q
  93.  cmpi.b  #'Q',(a0)
  94.  bne     NoParam
  95. Q:
  96.  adda.l  #1,a0
  97.  cmpi.b  #'u',(a0)
  98.  beq     U
  99.  cmpi.b  #'U',(a0)
  100.  bne     NoParam
  101. U:
  102.  adda.l  #1,a0
  103.  cmpi.b  #'i',(a0)
  104.  beq     I
  105.  cmpi.b  #'I',(a0)
  106.  bne     NoParam
  107. I:
  108.  adda.l  #1,a0
  109.  cmpi.b  #'t',(a0)
  110.  beq     T
  111.  cmpi.b  #'T',(a0)
  112.  bne     NoParam
  113. T:
  114.  adda.l  #1,a0
  115.  cmpi.b  #' ',(a0)
  116.  beq     FoundQuit
  117.  cmp.b   #10,(a0)
  118.  bne     NoParam
  119. FoundQuit:
  120.  moveq   #2,d6        ;the command was quit
  121.  bra     NoParam
  122.  
  123. StackAdjust:
  124.  movem.l (a7)+,d0/a0
  125. NoParam:
  126.  move.l  ExecBase,a6
  127.  move.l  #20,DOSResult   ;DOSResult will give a return value to DOS
  128.  
  129. Open_DOS:             ;we'll open dos.library
  130.  lea     DOS_Name,a1
  131.  moveq   #0,d0          ;any version
  132.  jsr     OpenLib(a6)
  133.  move.l  d0,DOS_Base
  134.  beq     No_DOS        ;if could not open DOS, then we should exit!
  135. Open_Intuition:
  136.  lea     Intuition_Name,a1
  137.  moveq   #0,d0              ;any version
  138.  jsr     OpenLib(a6)
  139.  move.l  d0,Intuition_Base   ;we (hopefully) opened intuition.library
  140.  beq     No_Intuition
  141.  move.l  #Text68000,CPUName    ;assume the CPU is 68000
  142.  move.l  ExecBase,a6
  143.  move.w  $128(a6),d0
  144.  andi.w  #$000f,d0      ;check the ExecBase
  145.  beq     My68000
  146.  andi.w  #$e,d0             ;is the CPU 68010?
  147.  bne     NO_68000_68010
  148.  move.l  #Text68010,CPUName      ;if yes, get the name
  149.  bra     My68000
  150. NO_68000_68010:
  151.  move.l  Intuition_Base,a6    ;ExecBase does not mention a 68000
  152.  move.l  #0,a0
  153.  lea     No68T,a1
  154.  lea     CancelT,a2
  155.  lea     CancelT,a3
  156.  move.l  #0,d0
  157.  move.l  #0,d1
  158.  move.l  #250,d2
  159.  move.l  #58,d3
  160.  jsr     AutoRequest(a6)     ;tell you don't have a 68000/68010
  161.  bra     Close_All
  162. My68000:
  163.  move.l  ExecBase,a6
  164.  lea     PortName,a1
  165.  jsr     FindPort(a6)        ;is the routine already present?
  166.  tst.l   d0
  167.  beq     InstallPort
  168.  move.l  Intuition_Base,a6    ;routine already installed!
  169.  move.l  #0,a0
  170.  lea     RoutinePresent,a1
  171.  lea     CancelT,a2
  172.  lea     CancelT,a3
  173.  move.l  #0,d0
  174.  move.l  #0,d1
  175.  move.l  #270,d2
  176.  move.l  #65,d3
  177.  jsr     AutoRequest(a6)      ;tell routine already present
  178.  move.l  #10,DOSResult
  179.  bra     Close_All
  180. InstallPort:
  181.  move.l  #-1,d0
  182.  jsr     AllocSignal(a6)     ;set up a proper message port.we may need
  183.  move.b  d0,SigBit           ;it in future versions of the program
  184.  movea.l #0,a1
  185.  jsr     FindTask(a6)
  186.  move.l  d0,ThisTask
  187.  move.l  #MSGPortEnd-MSGPort,d0  ; length  of actual code in d0
  188.  moveq   #1,d1         ;PUBLIC Memory, don't move it around!
  189.  jsr     AllocMem(a6)   ;allocate mem
  190.  move.l  d0,PortAddr    ;we should copy the message port so after exit
  191.  beq     NoMem          ;it remains in the memory
  192.  movea.l #MSGPort,a0
  193.  movea.l PortAddr,a1
  194.  move.l  #MSGPortEnd-MSGPort,d0
  195.  divu    #2,d0
  196.  andi.l  #$ffff,d0
  197.  sub.l   #1,d0
  198. copyport:
  199.  move.w  (a0)+,(a1)+      ;copy our exception code to the allocated mem
  200.  dbf     d0,copyport
  201.  move.l  PortAddr,a0      ;adjust pointer to name
  202.  move.l  #Name-MSGPort,d1
  203.  adda.l  d1,a0
  204.  movea.l #PortName-Name,a2
  205.  adda.l  a0,a2      ;a2 has the new address of the port name
  206.  move.l  a2,(a0)
  207.  move.l  #EndAddr-BeginAddr,d0  ; length  of actual code in d0
  208.  moveq   #1,d1            ;PUBLIC memory
  209.  jsr     AllocMem(a6)    ;allocate mem
  210.  move.l  d0,NewAddrExcept
  211.  bne     AddrAllocated
  212.  move.l  PortAddr,a1
  213.  move.l  #MSGPortEnd-MSGPort,d0
  214.  jsr     FreeMem(a6)
  215.  bra     NoMem
  216. AddrAllocated:
  217.  move.l  $c,OldAddrExcept  ;save the original 'address error' vector
  218.  movea.l #BeginAddr,a0
  219.  movea.l NewAddrExcept,a1
  220.  move.l  #EndAddr-BeginAddr,d0
  221.  divu    #2,d0
  222.  andi.l  #$ffff,d0
  223.  sub.l   #1,d0
  224. copyaddr:
  225.  move.w  (a0)+,(a1)+      ;copy our exception code to the allocated mem
  226.  dbf     d0,copyaddr
  227.  move.l  #EndIllegal-BeginIllegal,d0  ; length  of actual code in d0
  228.  moveq   #1,d1          ;PUBLIC Memory
  229.  jsr     AllocMem(a6)     ;allocate mem
  230.  move.l  d0,NewIllegalExcept
  231.  bne     IllAllocated
  232.  move.l  PortAddr,a1
  233.  move.l  #MSGPortEnd-MSGPort,d0
  234.  jsr     FreeMem(a6)
  235.  move.l  NewAddrExcept,a1
  236.  move.l  #EndAddr-BeginAddr,d0
  237.  jsr     FreeMem(a6)
  238.  bra     NoMem
  239. IllAllocated:
  240.  move.l  #1024,d0      ;there are 255 longword vector addresses
  241.  moveq   #1,d1          ;PUBLIC Memory
  242.  move.l  ExecBase,a6
  243.  jsr     AllocMem(a6)
  244.  move.l  d0,NewVec         ;address of the copied original vectors
  245.  bne     NewVecAllocated
  246.  move.l  PortAddr,a1            ;if we could not allocate enough mem. then
  247.  move.l  #MSGPortEnd-MSGPort,d0  ;we should free the previously allocated
  248.  jsr     FreeMem(a6)             ;mem.
  249.  move.l  NewIllegalExcept,a1
  250.  move.l  #EndIllegal-BeginIllegal,d0
  251.  jsr     FreeMem(a6)
  252.  move.l  NewAddrExcept,a1
  253.  move.l  #EndAddr-BeginAddr,d0
  254.  jsr     FreeMem(a6)
  255.  bra     NoMem
  256. NewVecAllocated:
  257.  move.l  $10,OldIllegalExcept  ;save the original illegal instruction vector
  258.  movea.l #BeginIllegal,a0
  259.  movea.l NewIllegalExcept,a1
  260.  move.l  #EndIllegal-BeginIllegal,d0
  261.  divu    #2,d0
  262.  andi.l  #$ffff,d0
  263.  sub.l   #1,d0
  264. copy:
  265.  move.w  (a0)+,(a1)+      ;copy our exception code to the allocated mem
  266.  dbf     d0,copy
  267.  move.l  #511,d0
  268.  movea.l #0,a0
  269.  movea.l NewVec,a1
  270. copy2:
  271.  move.w  (a0)+,(a1)+     ;get a copy of all the vector area contents
  272.  dbf     d0,copy2  
  273.  move.l  PortAddr,a1
  274.  jsr     AddPort(a6)
  275.  move.l  Intuition_Base,a6
  276.  lea     InfoWindow,a0
  277.  jsr     OpenWindow(a6)
  278.  move.l  d0,Window_Handler
  279.  beq     FrMem
  280.  lea     NextText1,a1
  281.  move.l  #5,d0
  282.  move.l  #3,d1
  283.  move.l  Window_Handler,a0
  284.  move.l  50(a0),a0           ;rastport
  285.  jsr     PrintIText(a6)
  286.  move.l  DOS_Base,a6
  287.  move.l  #175,d1
  288.  jsr     Delay(a6)
  289.  move.l  Intuition_Base,a6
  290.  move.l  Window_Handler,a0
  291.  jsr     CloseWindow(a6)
  292.  movea.l CPUName,a5
  293.  moveq   #0,d7                 ;0 = routine not installed
  294.  cmpi.l  #1,d6           ;command was '68k' ?
  295.  beq     Put68000
  296.  lea     Text68017,a5
  297.  move.l  NewAddrExcept,$c
  298.  move.l  NewIllegalExcept,$10
  299.  move.l  #-1,d7                  ;-1 = routine installed
  300.  cmpi.l  #2,d6           ;command was 'quit' ?
  301.  bne     Put68000
  302.  move.l  #0,DOSResult
  303.  bra     Close_All
  304. Put68000:
  305.  lea     WindowMain,a0        ;open window and write processor name
  306.  jsr     OpenWindow(a6)
  307.  move.l  d0,Window_Handler
  308.  beq     FrMem
  309.  movea.l a5,a1
  310.  move.l  #0,d0
  311.  move.l  #0,d1
  312.  move.l  Window_Handler,a0
  313.  move.l  50(a0),a0   ;rastport
  314.  jsr     PrintIText(a6)
  315.  lea     PText,a1
  316.  move.l  #0,d0
  317.  move.l  #0,d1
  318.  move.l  Window_Handler,a0
  319.  move.l  50(a0),a0             ;rastport
  320.  jsr     PrintIText(a6)
  321.  
  322. Loop:                        ;this is the mian loop
  323.  move.l  Intuition_Base,a6
  324.  move.l  Window_Handler,a0
  325.  move.l  86(a0),a0
  326.  move.l  ExecBase,a6
  327.  jsr     WaitPort(a6)          ;wait for a message to arrive
  328.  move.l  Window_Handler,a0
  329.  move.l  86(a0),a0
  330.  jsr     GetMsg(a6)
  331.  move.l  d0,a0
  332.  move.l  20(a0),d0
  333.  cmpi.l  #$200,d0
  334.  beq     CloseIt        ;was it close?
  335. GadChanged:
  336.  move.l  Intuition_Base,a6       ;no! the user changed the processor!
  337.  tst.l   d7                  ;should we install the routine or not?
  338.  beq     InstallRoutine
  339.  move.l  OldIllegalExcept,$10
  340.  move.l  OldAddrExcept,$c
  341.  movea.l CPUName,a1
  342.  move.l  #0,d0
  343.  move.l  #0,d1
  344.  move.l  Window_Handler,a0
  345.  move.l  50(a0),a0          ;rastport
  346.  jsr     PrintIText(a6)
  347.  not.l   d7
  348.  bra     Loop
  349.  
  350. InstallRoutine:               ;install the routine and write in the window
  351.  move.l  NewIllegalExcept,$10 ;that the processor is 68017
  352.  move.l  NewAddrExcept,$c
  353.  lea     Text68017,a1
  354.  move.l  #0,d0
  355.  move.l  #0,d1
  356.  move.l  Window_Handler,a0
  357.  move.l  50(a0),a0          ;rastport
  358.  jsr     PrintIText(a6)
  359.  not.l   d7
  360.  bra     Loop
  361.  
  362. CloseIt:
  363.  move.l  Intuition_Base,a6
  364.  tst.l   d7                ;based on the d7 contents,we should display
  365.  beq     JustQuit          ;different requesters before quitting
  366.  lea     Quit_Deinstall,a1 ;write: quitting without removing routine...
  367.  move.l  #300,d2
  368.  move.l  #63,d3
  369.  bra     Decide
  370. JustQuit:
  371.  lea     QuitT,a1    ;write: really want to quit ?
  372.  move.l  #240,d2
  373.  move.l  #57,d3
  374. Decide:
  375.  move.l  #0,a0
  376.  lea     YesT,a2
  377.  lea     CancelT,a3
  378.  move.l  #0,d0
  379.  move.l  #0,d1
  380.  jsr     AutoRequest(a6)       ;really want to quit?
  381.  tst     d0
  382.  beq     Loop
  383.  move.l  #0,DOSResult
  384.  move.l  Window_Handler,a0
  385.  jsr     CloseWindow(a6)
  386.  tst.l   d7
  387.  bne     Close_All
  388.  
  389. FrMem:
  390.  move.l  ExecBase,a6
  391.  move.l  NewAddrExcept,a1
  392.  move.l  #EndAddr-BeginAddr,d0
  393.  jsr     FreeMem(a6)
  394.  move.l  NewIllegalExcept,a1
  395.  move.l  #EndIllegal-BeginIllegal,d0
  396.  jsr     FreeMem(a6)
  397.  move.l  NewVec,a1
  398.  move.l  #1024,d0
  399.  jsr     FreeMem(a6)
  400.  move.l  PortAddr,a1
  401.  jsr     RemPort(a6)
  402.  move.l  PortAddr,a1
  403.  move.l  #MSGPortEnd-MSGPort,d0
  404.  jsr     FreeMem(a6)
  405.  bra     Close_All
  406.  
  407. NoMem:
  408.  move.l  Intuition_Base,a6
  409.  movea.l #0,a0
  410.  lea     MemErrorT,a1
  411.  lea     CancelT,a2
  412.  lea     CancelT,a3
  413.  move.l  #0,d0
  414.  move.l  #0,d1
  415.  move.l  #280,d2
  416.  move.l  #58,d3
  417.  jsr     AutoRequest(a6)      ;tell we could not allocate enough memory
  418.  
  419.  
  420. Close_All:
  421.  move.l  Intuition_Base,a1
  422.  move.l  ExecBase,a6
  423.  jsr     CloseLib(a6)
  424. Close_DOS:
  425. No_Intuition:
  426.  move.l  DOS_Base,a1
  427.  move.l  ExecBase,a6
  428.  jsr     CloseLib(a6)    ;close DOS
  429. No_DOS: 
  430.  move.l  DOSResult,d0
  431.  rts
  432.  
  433.  DATA
  434.  
  435. DOS_Name:       dc.b 'dos.library',0
  436. Intuition_Name: dc.b 'intuition.library',0
  437. PortAddr:       dc.l 0
  438. CPUName:        dc.l 0
  439.  
  440. MSGPort:       ;message port structure
  441.  dc.l 0  ;pred.
  442.  dc.l 0  ;succ.
  443.  dc.b 4  ;type = NT_MSGPORT
  444.  dc.b 0  ;priority = 0
  445. Name:
  446.  dc.l PortName ;name
  447.  dc.b 2 ;flags.do nothing 
  448. SigBit:
  449.  dc.b 0
  450. ThisTask:
  451.  dc.l 0
  452.  ds.b 16,0 ;list
  453.  
  454. PortName: dc.b 'Run68017 Is Present!',0
  455.  ds.w 0
  456. MSGPortEnd:
  457.  
  458. WindowMain:
  459.  dc.w 57,25
  460.  dc.w 150,45
  461.  dc.b 0,1
  462.  dc.l $240
  463.  dc.l $e
  464.  dc.l GadgetMain
  465.  dc.l 0
  466.  dc.l WindowMainName
  467.  dc.l 0
  468.  dc.l 0
  469.  dc.w 5,5
  470.  dc.w 640,200
  471.  dc.w 1
  472. WindowMainName: dc.b 'Run68017',0
  473.  ds.w 0
  474.  
  475. GadgetMain:      ;'change cpu' gadget
  476.  dc.l 0
  477.  dc.w 28,29
  478.  dc.w 92,10
  479.  dc.w 0
  480.  dc.w 1
  481.  dc.w 1
  482.  dc.l BorderMain
  483.  dc.l 0
  484.  dc.l TextGadMain
  485.  dc.l 0
  486.  dc.l 0
  487.  dc.w 0
  488.  dc.l 0
  489.  
  490. BorderMain:
  491.  dc.w -2,-1
  492.  dc.b 1,0,0
  493.  dc.b 5
  494.  dc.l BorderMainPair
  495.  dc.l 0
  496.  
  497. BorderMainPair:
  498.  dc.w 0,0
  499.  dc.w 94,0
  500.  dc.w 94,11
  501.  dc.w 0,11
  502.  dc.w 0,0
  503.  
  504. TextGadMain:
  505.  dc.b 3,0,0,0
  506.  dc.w 5,1
  507.  dc.l 0
  508.  dc.l GadTextMain
  509.  dc.l 0
  510. GadTextMain: dc.b 'CHANGE CPU',0
  511.  ds.w 0
  512.  
  513. PText:
  514.  dc.b 2,0,0,0
  515.  dc.w 10,14
  516.  dc.l TOPAZ80
  517.  dc.l Text2
  518.  dc.l 0
  519. Text2: dc.b 'Processor:',0
  520.  ds.w 0
  521.  
  522. Text68000:
  523.  dc.b 1,0,1,0
  524.  dc.w 99,14
  525.  dc.l 0
  526.  dc.l Text00
  527.  dc.l 0
  528. Text00: dc.b '68000',0
  529.  ds.w 0
  530.  
  531. Text68010:
  532.  dc.b 1,0,1,0
  533.  dc.w 99,14
  534.  dc.l 0
  535.  dc.l Text10
  536.  dc.l 0
  537. Text10: dc.b '68010',0
  538.  ds.w 0
  539.  
  540. Text68017:
  541.  dc.b 1,0,1,0
  542.  dc.w 99,14
  543.  dc.l 0
  544.  dc.l Text17
  545.  dc.l 0
  546. Text17: dc.b '68017',0
  547.  ds.w 0
  548.  
  549. No68T:
  550.  dc.b 2,0,0,0
  551.  dc.w 10,5
  552.  dc.l TOPAZ80
  553.  dc.l No68Text
  554.  dc.l 0
  555. No68Text: dc.b  ' 68000/68010 Not Found!',0
  556.  ds.w 0
  557.  
  558. RoutinePresent:
  559.  dc.b 2,0,0,0
  560.  dc.w 10,5
  561.  dc.l TOPAZ80
  562.  dc.l RPText1
  563.  dc.l RP2
  564. RPText1: dc.b  ' 68017 Emulation Routine',0
  565.  ds.w 0
  566.  
  567. RP2:
  568.  dc.b 2,0,0,0
  569.  dc.w 10,16
  570.  dc.l TOPAZ80
  571.  dc.l RPText2
  572.  dc.l 0
  573. RPText2: dc.b  ' Already Present!',0
  574.  ds.w 0
  575.  
  576. CancelT:
  577.  dc.b 2,0,0,0
  578.  dc.w 5,3
  579.  dc.l TOPAZ80
  580.  dc.l CancelText
  581.  dc.l 0
  582. CancelText: dc.b 'Cancel',0
  583.  ds.w 0
  584.  
  585. YesT:
  586.  dc.b 2,0,0,0
  587.  dc.w 5,3
  588.  dc.l TOPAZ80
  589.  dc.l YesText
  590.  dc.l 0
  591. YesText: dc.b 'Yes',0
  592.  ds.w 0
  593.  
  594. MemErrorT:
  595.  dc.b 2,0,0,0
  596.  dc.w 5,5
  597.  dc.l TOPAZ80
  598.  dc.l MemErrorText
  599.  dc.l 0
  600. MemErrorText: dc.b ' Could Not Allocate Memory!',0
  601.  ds.w 0
  602.  
  603. Quit_Deinstall:
  604.  dc.b 2,0,0,0
  605.  dc.w 5,5
  606.  dc.l TOPAZ80
  607.  dc.l QD1Text
  608.  dc.l Quit_Deinstall2
  609. QD1Text: dc.b ' Quit Run68017 Without Removing',0
  610.  ds.w 0
  611.  
  612. Quit_Deinstall2:
  613.  dc.b 2,0,0,0
  614.  dc.w 5,16
  615.  dc.l TOPAZ80
  616.  dc.l QD2Text
  617.  dc.l 0
  618. QD2Text: dc.b ' The Emulation Routine?',0
  619.  ds.w 0
  620.  
  621. QuitT:
  622.  dc.b 2,0,0,0
  623.  dc.w 5,5
  624.  dc.l TOPAZ80
  625.  dc.l QuitText
  626.  dc.l 0
  627. QuitText: dc.b ' Really Quit Run68017?',0
  628.  ds.w 0
  629.  
  630. InfoWindow:
  631.  dc.w 100,33
  632.  dc.w 350,85
  633.  dc.b 0,1
  634.  dc.l 0
  635.  dc.l $6
  636.  dc.l 0
  637.  dc.l 0
  638.  dc.l InfoWindowName
  639.  dc.l 0
  640.  dc.l 0
  641.  dc.w 5,5
  642.  dc.w 640,200
  643.  dc.w 1
  644. InfoWindowName: dc.b 'Run68017 ',0
  645.  ds.w 0
  646.  
  647. NextText1:
  648.  dc.b 1,0,0,0
  649.  dc.w 123,15
  650.  dc.l TOPAZ60
  651.  dc.l InfoText1
  652.  dc.l NextText2
  653. InfoText1: dc.b 'Run68017',0
  654.  ds.w 0
  655.  
  656. NextText2:
  657.  dc.b 1,0,0,0
  658.  dc.w 105,26
  659.  dc.l TOPAZ80
  660.  dc.l InfoText2
  661.  dc.l NextText3
  662. InfoText2: dc.b 'By Kamran Karimi',0
  663.  ds.w 0
  664.  
  665. NextText3:
  666.  dc.b 1,0,0,0
  667.  dc.w 10,36
  668.  dc.l TOPAZ80
  669.  dc.l InfoText3
  670.  dc.l NextText4
  671. InfoText3: dc.b 'This program allows you to use 68020',0
  672.  ds.w 0
  673.  
  674. NextText4:
  675.  dc.b 1,0,0,0
  676.  dc.w 10,46
  677.  dc.l TOPAZ80
  678.  dc.l InfoText4
  679.  dc.l NextText5
  680. InfoText4: dc.b 'instructions with a 68000.',0
  681.  ds.w 0
  682.  
  683. NextText5:
  684.  dc.b 1,0,0,0
  685.  dc.w 10,56
  686.  dc.l TOPAZ80
  687.  dc.l InfoText5
  688.  dc.l NextText6
  689. InfoText5: dc.b 'It uses Self-Modifying Code.',0
  690.  ds.w 0
  691.  
  692. NextText6:
  693.  dc.b 1,0,0,0
  694.  dc.w 10,66
  695.  dc.l TOPAZ80
  696.  dc.l InfoText6
  697.  dc.l 0
  698. InfoText6: dc.b 'Refer to Run68017.ReadMe for more info',0
  699.  ds.w 0
  700.  
  701. TOPAZ60:
  702.  dc.l Fontname
  703.  dc.l 589824
  704.  
  705. TOPAZ80:
  706.  dc.l Fontname
  707.  dc.l 524288
  708.  
  709. Fontname:
  710.  dc.b 'topaz.font',0
  711.  ds.w 0
  712.  
  713. DOS_Base:        dc.l 0
  714. Intuition_Base:  dc.l 0
  715. Window_Handler:  dc.l 0
  716. DOSResult:       dc.l 0
  717.  
  718.  
  719.  CODE
  720.  
  721. BeginAddr:
  722.  movem.l d0/d1/a0/a1/a6,-(a7)
  723.  move.l  ExecBase,a6
  724.  jsr     Forbid(a6)
  725.  movea.l 30(a7),a0
  726.  move.l  a0,d0
  727.  lsr.l   #1,d0
  728.  bcs     OddAddr
  729.  suba.l  #2,a0
  730.  bra     TestAddr
  731. OddAddr:
  732.  suba.l  #1,a0    ;a0 should hold an even address
  733. TestAddr:
  734.  move.w  (a0),d0
  735.  move.w  d0,d1
  736.  cmpi.w  #$61ff,d1
  737.  beq     B_S_R_L
  738.  andi.w  #$f0ff,d0
  739.  cmpi.w  #$60ff,d0
  740.  beq     B_R_A_L
  741.  
  742. IllegaleAddr:
  743.  jsr     Permit(a6)
  744.  movem.l (a7)+,d0/d1/a0/a1/a6
  745.  move.l  OldAddrExcept(pc),-(a7) ;place address of original except handler
  746.  suba.l  #2,a7                   ;as return address on the stack
  747.  move.w  14(a7),(a7)
  748.  bset    #5,(a7)
  749.  bclr    #7,(a7)
  750.  rte
  751.  
  752. B_c_c_L:   ;bra.l and bcc.l (when executed)  are te same
  753. B_R_A_L:
  754.  movea.l 30(a7),a0
  755.  move.l  (a0),d0
  756.  adda.l  d0,a0
  757.  move.l  a0,30(a7)
  758.  jsr     Permit(a6)
  759.  movem.l (a7)+,d0/d1/a0/a1/a6
  760.  adda.l  #8,a7         ;remove address error stack frame
  761.  btst    #7,(a7)
  762.  beq     NT00
  763.  move.l  $24,-(a7)
  764.  suba.l  #2,a7
  765.  move.w  6(a7),(a7)
  766.  bclr    #7,(a7)      ;no trace
  767.  bset    #5,(a7)      ;supervisor
  768. NT00:
  769.  rte
  770.  
  771.  
  772. B_S_R_L:
  773.  btst    #5,29(a7)      ;supervisor or user stack?
  774.  bne     SuperMode
  775.  movea.l 30(a7),a0
  776.  adda.l  #1,a0
  777.  move.l  (a0),d0
  778.  move.l  a0,d1
  779.  add.l   #4,d1
  780.  move    USP,a1
  781.  move.l  d1,(a1)
  782.  adda.l  d0,a0
  783.  move.l  a0,30(a7)
  784.  jsr     Permit(a6)
  785.  movem.l (a7)+,d0/d1/a0/a1/a6
  786.  adda.l  #8,a7         ;remove address error stack frame
  787.  btst    #7,(a7)
  788.  beq     NT10
  789.  move.l  $24,-(a7)
  790.  suba.l  #2,a7
  791.  move.w  6(a7),(a7)
  792.  bclr    #7,(a7)      ;no trace
  793.  bset    #5,(a7)      ;supervisor
  794. NT10:
  795.  rte
  796.  
  797.  
  798. SuperMode:
  799.  movea.l 30(a7),a0
  800.  adda.l  #1,a0
  801.  move.l  (a0),d0
  802.  add.l   #4,a0
  803.  move.l  a0,34(a7)  ;ret addr.
  804.  adda.l  d0,a0
  805.  move.l  a0,30(a7)  ;branch addr.
  806.  jsr     Permit(a6)
  807.  movem.l (a7)+,d0/d1/a0/a1/a6
  808.  adda.l  #8,a7         ;remove address error stack frame
  809.  btst    #7,(a7)      ;trace bit set at the time of error?
  810.  beq     NT11
  811.  move.l  $24,-(a7)
  812.  suba.l  #2,a7
  813.  move.w  6(a7),(a7)
  814.  bclr    #7,(a7)      ;no trace
  815.  bset    #5,(a7)      ;supervisor
  816. NT11:
  817.  rte
  818.  
  819.  
  820. OldAddrExcept:  dc.l 0
  821. NewAddrExcept:  dc.l 0
  822.  
  823. EndAddr:
  824.  
  825.  
  826. BeginIllegal:        ;determining which command caused exception
  827.  movem.l d0-d7/a0-a6,-(a7)
  828.  move.l  ExecBase,a6
  829.  jsr     Forbid(a6)
  830.  lea     StackP(pc),a3
  831.  move.w  60(a7),d0
  832.  btst    #13,d0
  833.  bne     SupStack
  834.  move    USP,a1
  835.  move.l  a1,(a3)
  836.  bra     StackSaved
  837. SupStack:
  838.  move.l  a7,(a3)
  839.  add.l   #66,(a3)
  840. StackSaved:         ;a7 at the time of exception saved!
  841.  movea.l 62(a7),a0
  842.  move.w  (a0),d3
  843.  move.w  d3,d4
  844.  lea     WhichOne(pc),a3
  845.  move.l  #1,(a3)     ;assume bfclr
  846.  andi.w  #$ffc0,d3
  847.  cmpi.w  #$ecc0,d3
  848.  beq     B_F_C_L_R
  849.  move.l  #2,(a3)     ;assume bfset
  850.  cmpi.w  #$eec0,d3
  851.  beq     B_F_S_E_T
  852.  move.l  #3,(a3)     ;assume bfchg
  853.  cmpi.w  #$eac0,d3
  854.  beq     B_F_C_H_G
  855.  move.l  #4,(a3)
  856.  cmpi.w  #$edc0,d3
  857.  beq     B_F_F_F_O
  858.  move.l  #5,(a3)
  859.  cmpi.w  #$e8c0,d3
  860.  beq     B_F_T_S_T
  861.  move.l  #6,(a3)
  862.  cmpi.w  #$e9c0,d3
  863.  beq     B_F_E_X_T_U
  864.  move.l  #7,(a3)
  865.  cmpi.w  #$ebc0,d3
  866.  beq     B_F_E_X_T_S
  867.  cmpi.w  #$efc0,d3
  868.  beq     B_F_I_N_S
  869.  move.w  d4,d3
  870.  andi.w  #$f9c0,d3
  871.  cmpi.w  #$00c0,d3
  872.  beq     CMP2_CHK2  ;chk2 or cmp2 ?
  873.  move.w  d4,d3
  874.  andi.w  #$f1c0,d3
  875.  cmpi.w  #$4100,d3
  876.  beq     C_H_K_L      ;chk.l ?
  877.  move.w  d4,d3
  878.  andi.w  #$ffc0,d3
  879.  cmpi.w  #$4c40,d3
  880.  beq     D_I_V_L    ;division ?
  881.  move.w  d4,d3
  882.  andi.w  #$ffc0,d3
  883.  cmpi.w  #$4c00,d3
  884.  beq     M_U_L_L    ;multiply ?
  885.  move.w  d4,d3
  886.  andi.w  #$f9ff,d3
  887.  cmpi.w  #$08fc,d3
  888.  beq     C_A_S_2     ;cas2 ?
  889.  move.w  d4,d3
  890.  andi.w  #$f9c0,d3
  891.  cmpi.w  #$08c0,d3
  892.  beq     C_A_S        ;cas ?
  893.  move.w  d4,d3
  894.  andi.w  #$f1f0,d3
  895.  cmpi.w  #$8180,d3
  896.  beq     U_N_P_K       ;unpk ?
  897.  move.w  d4,d3
  898.  andi.w  #$f1f0,d3
  899.  cmpi.w  #$8140,d3
  900.  beq     P_A_C_K       ;pack ?
  901.  move.w  d4,d3
  902.  andi.w  #$fff8,d3
  903.  cmpi.w  #$4808,d3
  904.  beq     L_I_N_K_L     ;link.l
  905.  move.w  d4,d3
  906.  andi.w  #$f0f8,d3
  907.  cmpi.w  #$50f8,d3     ;TRAPcc ?
  908.  beq     T_R_A_P_C_C
  909.  move.w  d4,d3
  910.  andi.w  #$fe00,d3
  911.  cmpi.w  #$4800,d3     ;EXTB ?
  912.  beq     E_X_T_B
  913.  move.w  d4,d3
  914.  cmpi.w  #$4e74,d3   ;was is RTD?
  915.  beq     R_T_D
  916.  lsr.w   #1,d3
  917.  cmpi.w  #$273d,d3     ;or MOVEC?
  918.  bne     what1
  919.  move.w  60(a7),d0  ;get status register
  920.  btst    #13,d0 ;check if we were in supervisor mode when exception occured
  921.  bne     M_O_V_E_C
  922.  jsr     Permit(a6)
  923.  movem.l (a7)+,d0-d7/a0-a6
  924.  move.l  $20,-(a7)           ;making a fake return address and SR on stack
  925.  suba.l  #2,a7
  926.  move.w  $6(a7),(a7)
  927.  bset    #5,(a7)    ;supervisor mode
  928.  bclr    #7,(a7)    ;no trace
  929.  rte              ;go privillage violation
  930. what1:
  931.  move.w  d4,d3
  932.  lsr.w   #8,d3
  933.  cmpi.w  #$0e,d3    ;was the illegal command MOVES?
  934.  bne     what2
  935.  move.w  60(a7),d0
  936.  btst    #13,d0      ;in supervisor mode
  937.  bne     M_O_V_E_S
  938.  jsr     Permit(a6)
  939.  movem.l (a7)+,d0-d7/a0-a6
  940.  move.l  $20,-(a7)    ;making a fake return address and SR on stack
  941.  suba.l  #2,a7
  942.  move.w  $6(a7),(a7)
  943.  bset    #5,(a7)    ;supervisor mode
  944.  bclr    #7,(a7)    ;no trace
  945.  rte               ; go privillage violation
  946. what2:
  947.  move.w  d4,d3
  948.  lsr.w   #6,d3
  949.  cmpi.w  #$010b,d3         ;was the instruction move ccr,<ea> ?
  950.  beq     M_O_V_E_F_C_C_R
  951.  
  952. illegale:      ;it was non of them so do the usual exception processing
  953.  move.l  ExecBase,a6
  954.  jsr     Permit(a6)
  955.  movem.l (a7)+,d0-d7/a0-a6
  956.  move.l  OldIllegalExcept(pc),-(a7) ;place address of original except handler
  957.  suba.l  #2,a7                  ;as return address on the stack
  958.  move.w  $6(a7),(a7)
  959.  bset    #5,(a7)
  960.  bclr    #7,(a7)
  961.  rte
  962.  
  963.  
  964.  
  965. B_F_I_N_S:
  966.  lea     Nextbfins(pc),a3
  967.  lea     Val3(pc),a4
  968.  move.l  a3,(a4)
  969.  bra     BFCommon              ;go to the common routine
  970. Nextbfins:
  971.  andi.b  #$f0,61(a7)  ;flags cleared
  972.  bset    #2,61(a7)   ;assume zero
  973.  move.l  #7,d3
  974.  move.l  d4,d1   ;d1 has width
  975.  sub.l   #1,d1
  976.  sub.l   d2,d3   ;d2 has offset
  977.  sub.l   d3,d4
  978.  sub.l   #1,d4
  979.  move.l  d3,d6  ;counter
  980.  move.l  62(a7),a0
  981.  move.w  2(a0),d0
  982.  andi.w  #$7000,d0
  983.  lsr.w   #7,d0
  984.  lsr.w   #5,d0
  985.  mulu    #4,d0
  986.  move.l  0(a7,d0),d0
  987.  btst    d1,d0
  988.  beq     InsLoop
  989.  bset    #3,61(a7)
  990. InsLoop:
  991.  btst    d1,d0
  992.  beq     ClrIns
  993.  bclr    #2,61(a7)
  994.  bset    d3,(a1)
  995.  bra     InstDone
  996. ClrIns:
  997.  bclr    d3,(a1)
  998. InstDone:
  999.  sub.l   #1,d1
  1000.  sub.l   #1,d3
  1001.  sub.l   #1,d6
  1002.  bpl     InsLoop
  1003.  adda.l  #1,a1
  1004.  divu    #8,d4
  1005.  move.l  d4,d5
  1006.  andi.l  #$ffff,d5
  1007.  beq     Noinsquote
  1008.  move.l  #7,d3
  1009.  move.l  #7,d6
  1010.  sub.l   #1,d5
  1011.  mulu    #8,d5
  1012.  swap    d4
  1013.  andi.l  #$ffff,d4
  1014.  add.l   d5,d4
  1015.  bra     InsLoop
  1016. Noinsquote:
  1017.  swap    d4
  1018.  tst.w   d4
  1019.  beq     InsDone
  1020.  move.l  d4,d6
  1021.  sub.l   #1,d6
  1022.  move.l  #7,d3
  1023.  moveq   #0,d4
  1024.  bra     InsLoop
  1025. InsDone:
  1026.  tst.l   d7             ;if the operand was in a data register, update it
  1027.  beq     insModified
  1028.  move.l  62(a7),a0
  1029.  move.w  (a0),d0
  1030.  andi.w  #$7,d0
  1031.  mulu    #4,d0
  1032.  move.l  SaveVal(pc),a1
  1033.  move.l  (a1),0(a7,d0)
  1034. insModified:
  1035.  move.l  62(a7),a0
  1036.  adda.l  NumAdd(pc),a0
  1037.  move.l  a0,62(a7)
  1038.  move.l  ExecBase,a6
  1039.  jsr     Permit(a6)
  1040.  movem.l (a7)+,d0-d7/a0-a6
  1041.  btst    #7,(a7)       ;trace bit was set at the time of exception?
  1042.  beq     NT30
  1043.  move.l  $24,-(a7)
  1044.  suba.l  #2,a7
  1045.  move.w  6(a7),(a7)
  1046.  bclr    #7,(a7)
  1047.  bset    #5,(a7)
  1048. NT30:
  1049.  rte
  1050.  
  1051.  
  1052.  
  1053. B_F_E_X_T_S:
  1054. B_F_E_X_T_U:
  1055.  lea     Nextbfext(pc),a3
  1056.  lea     Val3(pc),a4
  1057.  move.l  a3,(a4)
  1058.  bra     BFCommon
  1059. Nextbfext:
  1060.  move.l  d4,d0
  1061.  moveq   #0,d7
  1062.  andi.b  #$f0,61(a7)  ;flags cleared
  1063.  bset    #2,61(a7)   ;assume zero
  1064.  move.l  #7,d3
  1065.  sub.l   d2,d3
  1066.  sub.l   d3,d4
  1067.  sub.l   #1,d4
  1068.  move.l  d3,d6  ;counter
  1069.  btst    d3,(a1)
  1070.  beq     ExtLoop
  1071.  bset    #3,61(a7)
  1072. ExtLoop:
  1073.  btst    d3,(a1)
  1074.  beq     AZero
  1075.  bclr    #2,61(a7)
  1076.  bset    #0,d7
  1077.  bra     NextBit
  1078. AZero:
  1079.  bclr    #0,d7
  1080. NextBit:
  1081.  sub.l   #1,d3
  1082.  sub.l   #1,d6
  1083.  bpl     CommonLoop
  1084.  adda.l  #1,a1
  1085.  divu    #8,d4
  1086.  move.l  d4,d5
  1087.  andi.l  #$ffff,d5
  1088.  beq     Noextquote
  1089.  move.l  #7,d3
  1090.  move.l  #7,d6
  1091.  sub.l   #1,d5
  1092.  mulu    #8,d5
  1093.  swap    d4
  1094.  andi.l  #$ffff,d4
  1095.  add.l   d5,d4
  1096.  bra     CommonLoop
  1097. Noextquote:
  1098.  swap    d4
  1099.  tst.w   d4
  1100.  beq     ExtDone
  1101.  move.l  d4,d6
  1102.  sub.l   #1,d6
  1103.  move.l  #7,d3
  1104.  moveq   #0,d4
  1105. CommonLoop:
  1106.  lsl.l   #1,d7
  1107.  bra     ExtLoop
  1108. ExtDone:
  1109.  move.l  WhichOne(pc),d5
  1110.  cmpi.w  #6,d5
  1111.  beq     Plus
  1112.  btst    #3,61(a7)
  1113.  beq     Plus
  1114.  move.l  #31,d5
  1115.  sub.l   d0,d5
  1116. bfexts:
  1117.  bset    d0,d7
  1118.  add.l   #1,d0
  1119.  dbra    d5,bfexts
  1120. Plus:
  1121.  move.l  62(a7),a0
  1122.  move.w  2(a0),d0
  1123.  andi.w  #$7000,d0
  1124.  lsr.w   #5,d0
  1125.  lsr.w   #7,d0
  1126.  mulu    #4,d0
  1127.  move.l  d7,0(a7,d0)
  1128.  move.l  62(a7),a0
  1129.  adda.l  NumAdd(pc),a0
  1130.  move.l  a0,62(a7)
  1131.  move.l  ExecBase,a6
  1132.  jsr     Permit(a6)
  1133.  movem.l (a7)+,d0-d7/a0-a6
  1134.  btst    #7,(a7)
  1135.  beq     NT40
  1136.  move.l  $24,-(a7)
  1137.  suba.l  #2,a7
  1138.  move.w  6(a7),(a7)
  1139.  bclr    #7,(a7)
  1140.  bset    #5,(a7)
  1141. NT40:
  1142.  rte
  1143.  
  1144.  
  1145.  
  1146. B_F_T_S_T:
  1147. B_F_F_F_O:
  1148.  lea     Nextbftst(pc),a3
  1149.  lea     Val3(pc),a4
  1150.  move.l  a3,(a4)
  1151.  bra     BFCommon
  1152. Nextbftst:
  1153.  move.l  BFOffset(pc),d7 ;get the offset
  1154.  sub.l   #1,d7
  1155.  move.l  d4,d0   ;width
  1156.  andi.b  #$f0,61(a7)  ;flags cleared
  1157.  bset    #2,61(a7)   ;assume zero
  1158.  move.l  #7,d3
  1159.  sub.l   d2,d3
  1160.  sub.l   d3,d4
  1161.  sub.l   #1,d4
  1162.  move.l  d3,d6  ;counter
  1163.  btst    d3,(a1)
  1164.  beq     TestLoop
  1165.  bset    #3,61(a7)
  1166. TestLoop:
  1167.  add.l   #1,d7
  1168.  btst    d3,(a1)
  1169.  beq     tstDone
  1170.  bclr    #2,61(a7)
  1171.  bra     testDone
  1172. tstDone:
  1173.  sub.l   #1,d0
  1174.  beq     tstDone
  1175.  sub.l   #1,d3
  1176.  sub.l   #1,d6
  1177.  bpl     TestLoop
  1178.  adda.l  #1,a1
  1179.  divu    #8,d4
  1180.  move.l  d4,d5
  1181.  andi.l  #$ffff,d5
  1182.  beq     Notstquote
  1183.  move.l  #7,d3
  1184.  move.l  #7,d6
  1185.  sub.l   #1,d5
  1186.  mulu    #8,d5
  1187.  swap    d4
  1188.  andi.l  #$ffff,d4
  1189.  add.l   d5,d4
  1190.  bra     TestLoop
  1191. Notstquote:
  1192.  swap    d4
  1193.  tst.w   d4
  1194.  beq     testDone
  1195.  move.l  d4,d6
  1196.  sub.l   #1,d6
  1197.  move.l  #7,d3
  1198.  moveq   #0,d4
  1199.  bra     TestLoop
  1200. testDone:
  1201.  move.l  WhichOne(pc),d5
  1202.  cmpi.w  #5,d5
  1203.  beq     NobfDest
  1204.  move.l  62(a7),a0
  1205.  move.w  2(a0),d1
  1206.  andi.w  #$7000,d1
  1207.  lsr.w   #7,d1
  1208.  lsr.w   #5,d1
  1209.  mulu    #4,d1
  1210.  move.l  d7,0(a7,d1)
  1211. NobfDest:
  1212.  adda.l  NumAdd(pc),a0
  1213.  move.l  a0,62(a7)
  1214.  move.l  ExecBase,a6
  1215.  jsr     Permit(a6)
  1216.  movem.l (a7)+,d0-d7/a0-a6
  1217.  btst    #7,(a7)
  1218.  beq     NT50
  1219.  move.l  $24,-(a7)
  1220.  suba.l  #2,a7
  1221.  move.w  6(a7),(a7)
  1222.  bclr    #7,(a7)
  1223.  bset    #5,(a7)
  1224. NT50:
  1225.  rte
  1226.  
  1227.  
  1228.  
  1229. B_F_C_L_R:
  1230. B_F_S_E_T:
  1231. B_F_C_H_G:
  1232.  lea     Nextbfchg(pc),a3
  1233.  lea     Val3(pc),a4
  1234.  move.l  a3,(a4)
  1235.  bra     BFCommon
  1236. Nextbfchg:
  1237.  andi.b  #$f0,61(a7)  ;flags cleared
  1238.  bset    #2,61(a7)   ;assume zero
  1239.  move.l  #7,d3
  1240.  sub.l   d2,d3
  1241.  sub.l   d3,d4
  1242.  sub.l   #1,d4
  1243.  move.l  d3,d6  ;counter
  1244.  btst    d3,(a1)
  1245.  beq     ChangeLoop
  1246.  bset    #3,61(a7)
  1247. ChangeLoop:
  1248.  move.l  WhichOne(pc),d5
  1249.  cmpi.l  #1,d5
  1250.  bne     chgset
  1251.  bclr    d3,(a1)
  1252.  beq     chgset
  1253.  bclr    #2,61(a7)
  1254. chgset:
  1255.  cmpi.l  #2,d5
  1256.  bne     chg
  1257.  bset    d3,(a1)
  1258.  beq     chg
  1259.  bclr    #2,61(a7)
  1260. chg:
  1261.  cmpi.l  #3,d5
  1262.  bne     CLSDone
  1263.  bchg    d3,(a1)
  1264.  beq     CLSDone
  1265.  bclr    #2,61(a7)
  1266. CLSDone:
  1267.  sub.l   #1,d3
  1268.  sub.l   #1,d6
  1269.  bpl     ChangeLoop
  1270.  adda.l  #1,a1
  1271.  divu    #8,d4
  1272.  move.l  d4,d5
  1273.  andi.l  #$ffff,d5
  1274.  beq     Nochgquote
  1275.  move.l  #7,d3
  1276.  move.l  #7,d6
  1277.  sub.l   #1,d5
  1278.  mulu    #8,d5
  1279.  swap    d4
  1280.  andi.l  #$ffff,d4
  1281.  add.l   d5,d4
  1282.  bra     ChangeLoop
  1283. Nochgquote:
  1284.  swap    d4
  1285.  tst.w   d4
  1286.  beq     ChgDone
  1287.  move.l  d4,d6
  1288.  sub.l   #1,d6
  1289.  move.l  #7,d3
  1290.  moveq   #0,d4
  1291.  bra     ChangeLoop
  1292. ChgDone:
  1293.  tst.l   d7
  1294.  beq     chgModified
  1295.  move.l  62(a7),a0
  1296.  move.w  (a0),d0
  1297.  andi.w  #$7,d0
  1298.  mulu    #4,d0
  1299.  move.l  SaveVal(pc),a1
  1300.  move.l  (a1),0(a7,d0)
  1301. chgModified:
  1302.  move.l  62(a7),a0
  1303.  adda.l  NumAdd(pc),a0
  1304.  move.l  a0,62(a7)
  1305.  move.l  ExecBase,a6
  1306.  jsr     Permit(a6)
  1307.  movem.l (a7)+,d0-d7/a0-a6
  1308.  btst    #7,(a7)
  1309.  beq     NT60
  1310.  move.l  $24,-(a7)
  1311.  suba.l  #2,a7
  1312.  move.w  6(a7),(a7)
  1313.  bclr    #7,(a7)
  1314.  bset    #5,(a7)
  1315. NT60:
  1316.  rte
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322. CMP2_CHK2:
  1323.  lea     Flag(pc),a3
  1324.  move.l  #0,(a3)
  1325.  move.l  62(a7),a0
  1326.  move.w  (a0),d0
  1327.  move.w  d0,d4
  1328.  andi.w  #$0600,d0
  1329.  lsr.w   #7,d0
  1330.  lsr.w   #2,d0
  1331.  cmpi.w  #0,d0
  1332.  bne     cmplw
  1333.  move.w  #$1000,d2
  1334.  move.w  #0,d3
  1335.  move.l  #2,(a3)
  1336.  bra     CmpSizeDone
  1337. cmplw:
  1338.  cmpi.w  #$1,d0
  1339.  bne     cmpl
  1340.  move.w  #$3000,d2
  1341.  move.w  #$0040,d3
  1342.  move.l  #1,(a3)
  1343.  bra     CmpSizeDone
  1344. cmpl:
  1345.  move.w  #$2000,d2
  1346.  move.w  #$0080,d3
  1347. CmpSizeDone:
  1348.  move.l  62(a7),a0
  1349.  move.w  2(a0),d0
  1350.  btst    #15,d0
  1351.  beq     NotAddr
  1352.  add.l   #4,(a3)      ;address should be compared long!
  1353. NotAddr:
  1354.  lea     MoveCMP1(pc),a3
  1355.  andi.w  #$cfff,(a3)
  1356.  or.w    d2,(a3)
  1357.  lea     MoveCMP2(pc),a3
  1358.  andi.w  #$cfff,(a3)
  1359.  or.w    d2,(a3)
  1360.  lea     CMPHigh(pc),a3
  1361.  andi.w  #$fe3f,(a3)
  1362.  or.w    d3,(a3)
  1363.  lea     CMPLow(pc),a3
  1364.  andi.w  #$fe3f,(a3)
  1365.  or.w    d3,(a3)
  1366.  move.w  d4,d0
  1367.  andi.w  #$3f,d0
  1368.  lea     NumAdd(pc),a5
  1369.  lea     MoveCMP(pc),a3
  1370.  andi.w  #$ffc0,(a3)
  1371.  or.w    d0,(a3)
  1372.  move.l  #$4e714e71,2(a3)
  1373.  move.l  #4,(a5)
  1374.  cmpi.w  #$39,d0       ;abs long
  1375.  bne     labcmp10
  1376.  move.l  4(a0),2(a3)
  1377.  move.l  #8,(a5)
  1378.  bra     CMPDone
  1379. labcmp10:
  1380.  cmpi.w  #$38,d0    ;abs short
  1381.  bne     labcmp20
  1382.  move.w  4(a0),2(a3)
  1383.  move.l  #6,(a5)
  1384.  bra     CMPDone
  1385. labcmp20:
  1386.  cmpi.w  #$3c,d0   ;imm. data
  1387.  bne     labcmp30
  1388.  move.l  4(a0),2(a3)
  1389.  move.l  #8,(a5)
  1390.  bra     CMPDone
  1391. labcmp30:
  1392.  cmpi.w  #$3a,d0
  1393.  bne     labcmp40
  1394.  move.w  4(a0),d0
  1395.  ext.l   d0
  1396.  adda.l  #4,a0
  1397.  adda.l  d0,a0
  1398.  lea     saved1(pc),a3
  1399.  move.l  a0,(a3)
  1400.  move.l  #6,(a5)
  1401.  bra     PCcmpBack
  1402. labcmp40:
  1403.  cmpi.w  #$3b,d0
  1404.  bne     labcmp50
  1405. PCIndexcmp:
  1406.  move.l  62(a7),a0
  1407.  move.w  4(a0),d3
  1408.  btst    #8,d3
  1409.  beq     cmpshort
  1410.  lea     BDFlag(pc),a3
  1411.  move.l  #1,(a3)
  1412.  lea     cmp13(pc),a3
  1413.  lea     Val2(pc),a4
  1414.  move.l  a3,(a4)
  1415.  lea     Offset(pc),a3
  1416.  move.l  #4,(a3)
  1417.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  1418. cmp13:
  1419.  lea     MoveCMP(pc),a3
  1420.  andi.w  #$ffc0,(a3)
  1421.  ori.w   #$0039,(a3)
  1422.  move.l  RetAddr(pc),2(a3)
  1423.  bra     CMPDone
  1424. cmpshort:
  1425.  lea     NumAdd(pc),a4
  1426.  move.l  #6,(a4)
  1427.  lea     BDFlag(pc),a3
  1428.  move.l  #1,(a3)
  1429.  lea     cmp23(pc),a3
  1430.  lea     Val2(pc),a4
  1431.  move.l  a3,(a4)
  1432.  lea     Offset(pc),a3
  1433.  move.l  #4,(a3)
  1434.  bra     BriefFormat   ;it is a 68020 addressing mode
  1435. cmp23:
  1436.  lea     MoveCMP(pc),a3
  1437.  andi.w  #$ffc0,(a3)
  1438.  ori.w   #$0039,(a3)
  1439.  move.l  RetAddr(pc),2(a3)
  1440.  bra     CMPDone
  1441. labcmp50:
  1442.  andi.w  #$38,d0
  1443.  cmpi.w  #$28,d0
  1444.  bne     labcmp60
  1445.  move.w  4(a0),2(a3)
  1446.  move.l  #6,(a5)
  1447.  bra     CMPDone
  1448. labcmp60:
  1449.  cmpi.w  #$30,d0
  1450.  bne     labcmp70
  1451.  move.w  4(a0),d3
  1452.  btst    #8,d3
  1453.  beq     cmp12
  1454.  lea     BDFlag(pc),a3
  1455.  move.l  #0,(a3)
  1456.  lea     cmp11(pc),a3
  1457.  lea     Val2(pc),a4
  1458.  move.l  a3,(a4)
  1459.  lea     Offset(pc),a3
  1460.  move.l  #4,(a3)
  1461.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  1462. cmp11:
  1463.  lea     MoveCMP(pc),a3
  1464.  andi.w  #$ffc0,(a3)
  1465.  ori.w   #$0039,(a3)
  1466.  move.l  RetAddr(pc),2(a3)
  1467.  bra     CMPDone
  1468. cmp12:
  1469.  lea     NumAdd(pc),a4
  1470.  move.l  #6,(a4)
  1471.  lea     BDFlag(pc),a3
  1472.  move.l  #0,(a3)
  1473.  lea     cmp21(pc),a3
  1474.  lea     Val2(pc),a4
  1475.  move.l  a3,(a4)
  1476.  lea     Offset(pc),a3
  1477.  move.l  #4,(a3)
  1478.  bra     BriefFormat    ;it is a 68020 addressing mode
  1479. cmp21:
  1480.  lea     MoveCMP(pc),a3
  1481.  andi.w  #$ffc0,(a3)
  1482.  ori.w   #$0039,(a3)
  1483.  move.l  RetAddr(pc),2(a3)
  1484.  bra     CMPDone
  1485. labcmp70:
  1486.  cmpi.w  #$38,d0
  1487.  beq     illegale
  1488. CMPDone:
  1489.  move.l  Flag(pc),d7
  1490.  cmpi.l  #4,d7
  1491.  ble     Not32bitAddrcmp
  1492.  move.w  #$0080,d3
  1493.  lea     CMPHigh(pc),a3
  1494.  andi.w  #$fe3f,(a3)
  1495.  or.w    d3,(a3)
  1496.  lea     CMPLow(pc),a3
  1497.  andi.w  #$fe3f,(a3)
  1498.  or.w    d3,(a3)
  1499. Not32bitAddrcmp:
  1500.  lea     SaveA7(pc),a3
  1501.  move.l  a7,(a3)
  1502.  movem.l (a7)+,d0-d7/a0-a6
  1503.  lea     savea1(pc),a7
  1504.  move.l  a1,(a7)
  1505.  move.l  StackP(pc),a7
  1506. MoveCMP:
  1507.  lea     (a1),a1   ;(a1) will be changed to propper value
  1508.  nop
  1509.  nop
  1510.  lea     SaveVal(pc),a7
  1511.  move.l  a1,(a7)          ;SaveVal has the first operand
  1512.  move.l  savea1(pc),a1
  1513.  move.l  SaveA7(pc),a7
  1514.  adda.l  #60,a7
  1515.  movem.l d0-d7/a0-a6,-(a7)
  1516. PCcmpBack:
  1517.  movem.l (a7)+,d0-d7/a0-a6
  1518.  move.l  StackP(pc),-(a7)
  1519.  movem.l d0-d7/a0-a6,-(a7)
  1520.  move.l  66(a7),a0
  1521.  move.w  2(a0),d0
  1522.  move.w  d0,d1
  1523.  andi.w  #$7000,d0
  1524.  lsr.w   #7,d0
  1525.  lsr.w   #5,d0
  1526.  mulu    #4,d0
  1527.  btst    #15,d1
  1528.  beq     cmpdatareg
  1529.  add.l   #32,d0
  1530. cmpdatareg:
  1531.  move.l  0(a7,d0),d1   ;d1 has the register operand.
  1532.  lea     saved1(pc),a3
  1533.  move.l  d1,(a3)
  1534.  movem.l (a7)+,d0-d7/a0-a6
  1535.  adda.l  #4,a7
  1536.  movem.l d0-d7/a0-a6,-(a7)
  1537.  move.w  60(a7),d7
  1538.  bclr    #2,d7     ;reset Z
  1539.  bclr    #0,d7     ;reset C
  1540.  move.w  d7,60(a7)
  1541.  move.l  SaveVal(pc),a1
  1542.  lea     Val1(pc),a2
  1543.  lea     Val2(pc),a3
  1544. MoveCMP1:
  1545.  move.l  (a1)+,(a2)   ;lower bound
  1546. MoveCMP2:
  1547.  move.l  (a1),(a3)    ;upper bound
  1548.  move.l  saved1(pc),d1  ;d1 has register operand
  1549.  move.l  Flag(pc),d7
  1550.  cmpi.l  #4,d7
  1551.  ble     CMPLowVal
  1552.  move.l  Val1(pc),d3
  1553.  move.l  Val2(pc),d4
  1554.  btst    #0,d7
  1555.  bne     extLong
  1556.  ext.w   d3
  1557.  ext.w   d4
  1558. extLong:
  1559.  ext.l   d3
  1560.  ext.l   d4
  1561.  lea     Val1(pc),a3
  1562.  lea     Val2(a3),a4
  1563.  move.l  d3,(a3)
  1564.  move.l  d4,(a4)
  1565. CMPLowVal:
  1566.  move.w  60(a7),d7
  1567. CMPLow:
  1568.  cmp.l   Val1(pc),d1
  1569.  blt     CMPOut
  1570.  bne     CMPHigh
  1571.  bset    #2,d7
  1572. CMPHigh:
  1573.  cmp.l   Val2(pc),d1
  1574.  ble     CMPIn
  1575. CMPOut:
  1576.  bset    #0,d7
  1577.  move.w  d7,60(a7)
  1578.  move.l  62(a7),a0
  1579.  move.w  2(a0),d1
  1580.  btst    #11,d1
  1581.  beq     CmpBound
  1582.  adda.l  NumAdd(pc),a0
  1583.  move.l  a0,62(a7)
  1584.  move.l  ExecBase,a6
  1585.  jsr     Permit(a6)
  1586.  movem.l (a7)+,d0-d7/a0-a6
  1587.  move.l  $18,-(a7)         ;go CHK,CHK2 exception routine
  1588.  suba.l  #2,a7
  1589.  move.w  6(a7),(a7)
  1590.  bclr    #7,(a7)
  1591.  bset    #5,(a7)
  1592.  rte
  1593.  
  1594. CMPIn:             ;no need to go CHK,CHK2 exception!,either operands within
  1595.  bne     CmpBound   ;bounds or it was CMP2
  1596.  bset    #2,d7
  1597. CmpBound:
  1598.  move.w  d7,60(a7)
  1599.  move.l  62(a7),a0
  1600.  adda.l  NumAdd(pc),a0
  1601.  move.l  a0,62(a7)
  1602.  move.l  ExecBase,a6
  1603.  jsr     Permit(a6)
  1604.  movem.l (a7)+,d0-d7/a0-a6
  1605.  btst    #7,(a7)
  1606.  beq     NT71
  1607.  move.l  $24,-(a7)
  1608.  suba.l  #2,a7
  1609.  move.w  6(a7),(a7)
  1610.  bclr    #7,(a7)
  1611.  bset    #5,(a7)
  1612. NT71:
  1613.  rte
  1614.  
  1615.  
  1616. C_H_K_L:
  1617.  move.l  62(a7),a0
  1618.  move.w  (a0),d0
  1619.  andi.w  #$3f,d0
  1620.  lea     NumAdd(pc),a5
  1621.  lea     MoveCHK(pc),a3
  1622.  andi.w  #$ffc0,(a3)
  1623.  or.w    d0,(a3)
  1624.  move.l  #$4e714e71,2(a3)
  1625.  move.l  #2,(a5)
  1626.  cmpi.w  #$39,d0       ;abs long
  1627.  bne     labchk10
  1628.  move.l  2(a0),2(a3)
  1629.  move.l  #6,(a5)
  1630.  bra     CHKDone
  1631. labchk10:
  1632.  cmpi.w  #$38,d0    ;abs short
  1633.  bne     labchk20
  1634.  move.w  2(a0),2(a3)
  1635.  move.l  #4,(a5)
  1636.  bra     CHKDone
  1637. labchk20:
  1638.  cmpi.w  #$3c,d0   ;imm. data
  1639.  bne     labchk30
  1640.  move.l  2(a0),2(a3)
  1641.  move.l  #6,(a5)
  1642.  bra     CHKDone
  1643. labchk30:
  1644.  cmpi.w  #$3a,d0
  1645.  bne     labchk40
  1646.  moveq   #2,d1             ;operand size for PCRelative
  1647.  lea     NumAdd(pc),a3
  1648.  move.l  #4,(a3)
  1649.  lea     chklr(pc),a3
  1650.  lea     Val3(pc),a4
  1651.  move.l  a3,(a4)
  1652.  bra     PCRelative
  1653. chklr:
  1654.  bra     PCchkBack
  1655. labchk40:
  1656.  cmpi.w  #$3b,d0
  1657.  bne     labchk50
  1658.  lea     NumAdd(pc),a3
  1659.  move.l  #4,(a3)
  1660.  moveq   #2,d1
  1661.  lea     chkli(pc),a3
  1662.  lea     Val3(pc),a4
  1663.  move.l  a3,(a4)
  1664.  lea     PCIndex(pc),a3
  1665.  jmp     (a3)
  1666. chkli:
  1667.  bra     PCchkBack
  1668. labchk50:
  1669.  andi.w  #$38,d0
  1670.  cmpi.w  #$28,d0
  1671.  bne     labchk60
  1672.  move.w  2(a0),2(a3)
  1673.  move.l  #4,(a5)
  1674.  bra     CHKDone
  1675. labchk60:
  1676.  cmpi.w  #$30,d0
  1677.  bne     labchk70
  1678.  move.w  2(a0),d3
  1679.  btst    #8,d3
  1680.  beq     chk12
  1681.  lea     BDFlag(pc),a3
  1682.  move.l  #0,(a3)
  1683.  lea     chk11(pc),a3
  1684.  lea     Val2(pc),a4
  1685.  move.l  a3,(a4)
  1686.  lea     Offset(pc),a3
  1687.  move.l  #2,(a3)
  1688.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  1689. chk11:
  1690.  move.l  RetAddr(pc),a1
  1691.  move.l  (a1),d3
  1692.  bra     PCchkBack
  1693. chk12:
  1694.  lea     BDFlag(pc),a3
  1695.  move.l  #0,(a3)
  1696.  lea     NumAdd(pc),a4
  1697.  move.l  #4,(a4)
  1698.  lea     chk21(pc),a3
  1699.  lea     Val2(pc),a4
  1700.  move.l  a3,(a4)
  1701.  lea     Offset(pc),a3
  1702.  move.l  #2,(a3)
  1703.  bra     BriefFormat   ;it is a 68020 addressing mode
  1704. chk21:
  1705.  move.l  RetAddr(pc),a1
  1706.  move.l  (a1),d3
  1707.  bra     PCchkBack
  1708. labchk70:
  1709.  cmpi.w  #$38,d0
  1710.  beq     illegale
  1711. CHKDone:
  1712.  lea     SaveA7(pc),a3
  1713.  move.l  a7,(a3)
  1714.  movem.l (a7)+,d0-d7/a0-a6
  1715.  lea     savea1(pc),a7
  1716.  move.l  a1,(a7)
  1717.  move.l  StackP(pc),a7
  1718. MoveCHK:
  1719.  movea.l d0,a1   ;d0 will be changed to propper value
  1720.  nop
  1721.  nop
  1722.  lea     saved1(pc),a7
  1723.  move.l  a1,(a7)          ;saved1 has the first operand
  1724.  move.l  savea1(pc),a1
  1725.  move.l  SaveA7(pc),a7
  1726.  adda.l  #60,a7
  1727.  movem.l d0-d7/a0-a6,-(a7)
  1728.  move.l  saved1(pc),d3    ;d3 has the <ea> operand.
  1729. PCchkBack:
  1730.  move.l  62(a7),a0
  1731.  move.w  (a0),d0
  1732.  andi.w  #$0e00,d0
  1733.  lsr.w   #7,d0
  1734.  lsr.w   #2,d0
  1735.  mulu    #4,d0
  1736.  move.l  0(a7,d0),d1   ;d1 has the register operand.
  1737.  cmpi.l  #0,d1
  1738.  blt     LessZero  ;less than zero
  1739.  cmp.l   d3,d1
  1740.  bgt     GreatEf   ;greater than <ea>
  1741.  bra     DoneCHK
  1742. LessZero:
  1743.  move.w  60(a7),d0
  1744.  bset    #3,d0
  1745.  move.w  d0,60(a7)
  1746.  bra     GoCHKTrap
  1747. GreatEf:
  1748.  move.w  60(a7),d0
  1749.  bclr    #3,d0
  1750.  move.w  d0,60(a7)
  1751. GoCHKTrap:
  1752.  movea.l 62(a7),a0
  1753.  adda.l  NumAdd(pc),a0
  1754.  move.l  a0,62(a7)
  1755.  move.l  ExecBase,a6
  1756.  jsr     Permit(a6)
  1757.  movem.l (a7)+,d0-d7/a0-a6
  1758.  move.l  $18,-(a7)          ;go CHK,CHK2 exception processing
  1759.  suba.l  #2,a7
  1760.  move.w  6(a7),(a7)
  1761.  bclr    #7,(a7)
  1762.  bset    #5,(a7)
  1763.  rte
  1764. DoneCHK:
  1765.  movea.l 62(a7),a0
  1766.  adda.l  NumAdd(pc),a0
  1767.  move.l  a0,62(a7)
  1768.  move.l  ExecBase,a6
  1769.  jsr     Permit(a6)
  1770.  movem.l (a7)+,d0-d7/a0-a6
  1771.  btst    #7,(a7)
  1772.  beq     NT80
  1773.  move.l  $24,-(a7)
  1774.  suba.l  #2,a7
  1775.  move.w  6(a7),(a7)
  1776.  bclr    #7,(a7)
  1777.  bset    #5,(a7)
  1778. NT80:
  1779.  rte
  1780.  
  1781.  
  1782.  
  1783. D_I_V_L:
  1784.  move.l  62(a7),a0
  1785.  move.w  (a0),d0
  1786.  andi.w  #$3f,d0
  1787.  lea     NumAdd(pc),a5
  1788.  lea     MoveDiv(pc),a3
  1789.  andi.w  #$ffc0,(a3)
  1790.  or.w    d0,(a3)
  1791.  move.l  #$4e714e71,2(a3)
  1792.  move.l  #4,(a5)
  1793.  cmpi.w  #$39,d0       ;abs long
  1794.  bne     labdiv10
  1795.  move.l  4(a0),2(a3)
  1796.  move.l  #8,(a5)
  1797.  bra     DivDone
  1798. labdiv10:
  1799.  cmpi.w  #$38,d0    ;abs short
  1800.  bne     labdiv20
  1801.  move.w  4(a0),2(a3)
  1802.  move.l  #6,(a5)
  1803.  bra     DivDone
  1804. labdiv20:
  1805.  cmpi.w  #$3c,d0   ;imm. data
  1806.  bne     labdiv30
  1807.  move.l  4(a0),2(a3)
  1808.  move.l  #8,(a5)
  1809.  bra     DivDone
  1810. labdiv30:
  1811.  cmpi.w  #$3a,d0
  1812.  bne     labdiv40
  1813.  moveq   #4,d1             ;operand size for PCRelative
  1814.  lea     NumAdd(pc),a3
  1815.  move.l  #6,(a3)
  1816.  lea     divr(pc),a3
  1817.  lea     Val3(pc),a4
  1818.  move.l  a3,(a4)
  1819.  bra     PCRelative
  1820.  
  1821. divr:
  1822.  bra     PCDivBack
  1823. labdiv40:
  1824.  cmpi.w  #$3b,d0
  1825.  bne     labdiv50
  1826.  lea     NumAdd(pc),a3
  1827.  move.l  #6,(a3)
  1828.  moveq   #4,d1
  1829.  lea     divi(pc),a3
  1830.  lea     Val3(pc),a4
  1831.  move.l  a3,(a4)
  1832.  bra     PCIndex
  1833. divi:
  1834.  bra     PCDivBack
  1835. labdiv50:
  1836.  andi.w  #$38,d0
  1837.  cmpi.w  #$28,d0
  1838.  bne     labdiv60
  1839.  move.w  4(a0),2(a3)
  1840.  move.l  #6,(a5)
  1841.  bra     DivDone
  1842. labdiv60:
  1843.  cmpi.w  #$30,d0  ;index
  1844.  bne     labdiv70
  1845.  move.w  4(a0),d3
  1846.  btst    #8,d3
  1847.  beq     div12
  1848.  lea     BDFlag(pc),a3
  1849.  move.l  #0,(a3)
  1850.  lea     div11(pc),a3
  1851.  lea     Val2(pc),a4
  1852.  move.l  a3,(a4)
  1853.  lea     Offset(pc),a3
  1854.  move.l  #4,(a3)
  1855.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  1856. div11:
  1857.  move.l  RetAddr(pc),a1
  1858.  move.l  (a1),d3
  1859.  bra     PCDivBack
  1860. div12:
  1861.  lea     NumAdd(pc),a4
  1862.  move.l  #6,(a4)
  1863.  lea     BDFlag(pc),a3
  1864.  move.l  #0,(a3)
  1865.  lea     div21(pc),a3
  1866.  lea     Val2(pc),a4
  1867.  move.l  a3,(a4)
  1868.  lea     Offset(pc),a3
  1869.  move.l  #4,(a3)
  1870.  bra     BriefFormat   ;it is a 68020 addressing mode
  1871. div21:
  1872.  move.l  RetAddr(pc),a1
  1873.  move.l  (a1),d3
  1874.  bra     PCDivBack
  1875. labdiv70:
  1876.  cmpi.w  #$38,d0
  1877.  beq     illegale
  1878. DivDone:
  1879.  lea     SaveA7(pc),a3
  1880.  move.l  a7,(a3)
  1881.  movem.l (a7)+,d0-d7/a0-a6
  1882.  lea     savea1(pc),a7
  1883.  move.l  a1,(a7)
  1884.  move.l  StackP(pc),a7
  1885. MoveDiv:
  1886.  movea.l d0,a1   ;d0 will be changed to propper value
  1887.  nop
  1888.  nop
  1889.  lea     saved1(pc),a7
  1890.  move.l  a1,(a7)          ;saved1 has the first operand
  1891.  move.l  savea1(pc),a1
  1892.  move.l  SaveA7(pc),a7
  1893.  adda.l  #60,a7
  1894.  movem.l d0-d7/a0-a6,-(a7)
  1895.  move.l  saved1(pc),d3    ;d3 has the <ea> operand.(divisor)
  1896. PCDivBack:
  1897.  move.l  62(a7),a0
  1898.  move.w  2(a0),d0
  1899.  lsr.w   #7,d0
  1900.  lsr.w   #5,d0
  1901.  mulu    #4,d0
  1902.  move.l  0(a7,d0),d1   ;d1 has the register operand.(dividend)
  1903.  tst.l   d3
  1904.  bne     NotZeroDiv
  1905.  move.l  62(a7),d0
  1906.  add.l   NumAdd(pc),d0
  1907.  move.l  d0,62(a7)
  1908.  move.l  ExecBase,a6
  1909.  jsr     Permit(a6)
  1910.  movem.l (a7)+,d0-d7/a0-a6   ;go division by zero
  1911.  move.l  $14,-(a7)
  1912.  suba.l  #2,a7
  1913.  move.w  6(a7),(a7)
  1914.  bclr    #7,(a7)
  1915.  bset    #5,(a7)
  1916.  rte              ;divide by zero
  1917. NotZeroDiv:
  1918.  lea     SaveVal(pc),a3
  1919.  move.l  #0,(a3)
  1920.  move.l  62(a7),a0
  1921.  move.w  2(a0),d4
  1922.  moveq   #0,d2
  1923.  btst    #10,d4
  1924.  beq     TestSign
  1925.  andi.w  #$7,d4
  1926.  mulu    #4,d4
  1927.  move.l  0(a7,d4),d2
  1928.  move.w  2(a0),d4
  1929. TestSign:               ;test to see if the division is signed
  1930.  btst    #11,d4        ;if yes, make the operans positive and divide
  1931.  beq     UnSignedDiv   ;then adjust the signs
  1932.  btst    #10,d4
  1933.  beq     Div32Div
  1934.  tst.l   d2
  1935.  bpl     FirstPlusDiv
  1936.  not.l   d1
  1937.  not.l   d2
  1938.  moveq   #0,d0
  1939.  add.l   #1,d1
  1940.  addx.l  d0,d2
  1941.  add.l   #1,(a3)
  1942.  bra     FirstPlusDiv
  1943. Div32Div:
  1944.  tst.l   d1
  1945.  bpl     FirstPlusDiv
  1946.  neg.l   d1
  1947.  add.l   #1,(a3)
  1948. FirstPlusDiv:
  1949.  tst.l   d3
  1950.  bpl     UnSignedDiv
  1951.  neg.l   d3
  1952.  add.l   #2,(a3)
  1953. UnSignedDiv:       ;d2:d1 ;Dividend - quot.
  1954.  moveq   #0,d4    ;d4:d3
  1955.  moveq   #0,d6
  1956. Div:
  1957.  move.l  #64,d0   ;counter
  1958.  moveq   #0,d5    ;d6:d5 Rem.
  1959.  move    #0,ccr
  1960.  roxl.l  #1,d1    ;d2:d1 Quot.
  1961.  roxl.l  #1,d2
  1962.  roxl.l  #1,d5
  1963.  roxl.l  #1,d6
  1964. Div0:
  1965.  sub.l   d3,d5
  1966.  subx.l  d4,d6
  1967.  bcc     Div1
  1968.  add.l   d3,d5
  1969.  addx.l  d4,d6
  1970.  move    #16,ccr  ;should go to x
  1971. Div1:
  1972.  eori    #$10,ccr
  1973.  roxl.l  #1,d1
  1974.  roxl.l  #1,d2
  1975.  move    sr,d7
  1976.  sub.l   #1,d0
  1977.  beq     DoneDiv
  1978.  move    d7,ccr
  1979.  roxl.l  #1,d5
  1980.  roxl.l  #1,d6
  1981.  bra     Div0
  1982. DoneDiv:
  1983.  move.l  62(a7),a0
  1984.  move.w  2(a0),d0
  1985.  btst    #11,d0
  1986.  beq     UnSignedDiv2
  1987.  move.l  SaveVal(pc),d0
  1988.  tst.l   d0
  1989.  beq     UnSignedDiv2
  1990.  cmpi.l  #1,d0
  1991.  bne     DivisorNeg
  1992.  neg.l   d5    ;neg rem.
  1993.  neg.l   d1    ;and quot.
  1994. DivisorNeg:
  1995.  cmpi.l  #2,d0
  1996.  bne     RemNeg
  1997.  neg.l   d1    ;neg quot.
  1998. RemNeg:
  1999.  cmpi.l  #3,d0
  2000.  bne     UnSignedDiv2
  2001.  neg.l   d5       ;neg rem
  2002. UnSignedDiv2:
  2003.  move.l  62(a7),a0
  2004.  move.w  2(a0),d0
  2005.  move.w  d0,d7
  2006.  move.w  d7,d6
  2007.  andi.w  #$7,d0
  2008.  lsr.w   #7,d6
  2009.  lsr.w   #5,d6
  2010.  mulu    #4,d6
  2011.  mulu    #4,d0
  2012.  move.l  d5,0(a7,d0)
  2013. DivQ:
  2014.  move.l  d1,0(a7,d6)
  2015.  move    SR,d3      ;affect the flags
  2016.  andi.w  #$f,d3
  2017.  move.w  60(a7),d4
  2018.  andi.w  #$fff0,d4
  2019.  or.w    d3,d4
  2020.  tst.l   d2
  2021.  beq     NoOverFlow
  2022.  bset    #1,d4
  2023. NoOverFlow:
  2024.  move.w  d4,60(a7)
  2025.  movea.l 62(a7),a0
  2026.  adda.l  NumAdd(pc),a0
  2027.  move.l  a0,62(a7)
  2028.  movem.l (a7)+,d0-d7/a0-a6
  2029.  btst    #7,(a7)
  2030.  beq     NT90
  2031.  move.l  $24,-(a7)
  2032.  suba.l  #2,a7
  2033.  move.w  6(a7),(a7)
  2034.  bclr    #7,(a7)
  2035.  bset    #5,(a7)
  2036. NT90:
  2037.  rte
  2038.  
  2039.  
  2040.  
  2041. M_U_L_L:
  2042.  move.l  62(a7),a0
  2043.  move.w  (a0),d0
  2044.  andi.w  #$3f,d0
  2045.  lea     NumAdd(pc),a4
  2046.  lea     MoveMul(pc),a3
  2047.  andi.w  #$ffc0,(a3)
  2048.  or.w    d0,(a3)
  2049.  move.l  #$4e714e71,2(a3)
  2050.  move.l  #4,(a4)
  2051.  cmpi.w  #$39,d0       ;abs long
  2052.  bne     labmul10
  2053.  move.l  4(a0),2(a3)
  2054.  move.l  #8,(a4)
  2055.  bra     MulDone
  2056. labmul10:
  2057.  cmpi.w  #$38,d0    ;abs short
  2058.  bne     labmul20
  2059.  move.w  4(a0),2(a3)
  2060.  move.l  #6,(a4)
  2061.  bra     MulDone
  2062. labmul20:
  2063.  cmpi.w  #$3c,d0   ;imm. data
  2064.  bne     labmul30
  2065.  move.l  4(a0),2(a3)
  2066.  move.l  #8,(a4)
  2067.  bra     MulDone
  2068. labmul30:
  2069.  cmpi.w  #$3a,d0
  2070.  bne     labmul40
  2071.  moveq   #4,d1             ;operand size for PCRelative
  2072.  lea     NumAdd(pc),a3
  2073.  move.l  #6,(a3)
  2074.  lea     mulr(pc),a3
  2075.  lea     Val3(pc),a4
  2076.  move.l  a3,(a4)
  2077.  bra     PCRelative
  2078. mulr:
  2079.  bra     PCMulBack
  2080. labmul40:
  2081.  cmpi.w  #$3b,d0
  2082.  bne     labmul50
  2083.  lea     NumAdd(pc),a3
  2084.  move.l  #6,(a3)
  2085.  moveq   #4,d1
  2086.  lea     muli(pc),a3
  2087.  lea     Val3(pc),a4
  2088.  move.l  a3,(a4)
  2089.  bra     PCIndex
  2090.  
  2091. muli:
  2092.  bra     PCMulBack
  2093. labmul50:
  2094.  andi.w  #$38,d0
  2095.  cmpi.w  #$28,d0
  2096.  bne     labmul60
  2097.  move.w  4(a0),2(a3)
  2098.  move.l  #6,(a4)
  2099.  bra     MulDone
  2100. labmul60:
  2101.  cmpi.w  #$30,d0     ;index
  2102.  bne     labmul70
  2103.  move.l  4(a0),d3
  2104.  btst    #8,d3
  2105.  beq     mul12
  2106.  lea     BDFlag(pc),a3
  2107.  move.l  #0,(a3)
  2108.  lea     mul11(pc),a3
  2109.  lea     Val2(pc),a4
  2110.  move.l  a3,(a4)
  2111.  lea     Offset(pc),a3
  2112.  move.l  #4,(a3)
  2113.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  2114. mul11:
  2115.  move.l  RetAddr(pc),a1
  2116.  move.l  (a1),d3
  2117.  bra     PCMulBack
  2118. mul12:
  2119.  lea     NumAdd(pc),a4
  2120.  move.l  #6,(a4)
  2121.  lea     BDFlag(pc),a3
  2122.  move.l  #0,(a3)
  2123.  lea     mul21(pc),a3
  2124.  lea     Val2(pc),a4
  2125.  move.l  a3,(a4)
  2126.  lea     Offset(pc),a3
  2127.  move.l  #4,(a3)
  2128.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  2129. mul21:
  2130.  move.l  RetAddr(pc),a1
  2131.  move.l  (a1),d3
  2132.  bra     PCMulBack
  2133. labmul70:
  2134.  cmpi.w  #$38,d0
  2135.  beq     illegale
  2136. MulDone:
  2137.  lea     SaveA7(pc),a3
  2138.  move.l  a7,(a3)
  2139.  movem.l (a7)+,d0-d7/a0-a6
  2140.  lea     savea1(pc),a7
  2141.  move.l  a1,(a7)
  2142.  move.l  StackP(pc),a7
  2143. MoveMul:
  2144.  movea.l d0,a1   ;d0 will be changed to propper value
  2145.  nop
  2146.  nop
  2147.  lea     saved1(pc),a7
  2148.  move.l  a1,(a7)          ;saved1 has the first operand
  2149.  move.l  savea1(pc),a1
  2150.  move.l  SaveA7(pc),a7
  2151.  adda.l  #60,a7
  2152.  movem.l d0-d7/a0-a6,-(a7)
  2153.  move.l  saved1(pc),d3    ;d3 has the <ea> operand
  2154. PCMulBack:
  2155.  move.l  62(a7),a0
  2156.  move.w  2(a0),d0
  2157.  lsr.w   #7,d0
  2158.  lsr.w   #5,d0
  2159.  mulu    #4,d0
  2160.  move.l  0(a7,d0),d1   ;d1 has the register operand
  2161.  move.l  62(a7),a0
  2162.  move.w  2(a0),d4
  2163.  btst    #11,d4
  2164.  beq     UnSigned
  2165.  lea     SaveVal(pc),a3
  2166.  move.l  #0,(a3)
  2167.  tst.l   d1
  2168.  bpl     FirstPlus
  2169.  neg.l   d1
  2170.  add.l   #1,(a3)
  2171. FirstPlus:
  2172.  tst.l   d3
  2173.  bpl     UnSigned
  2174.  neg.l   d3
  2175.  add.l   #1,(a3)
  2176. UnSigned:
  2177.  move.l  d1,d2
  2178.  move.l  d3,d4
  2179.  mulu    d1,d3
  2180.  move.l  d3,d6
  2181.  move.l  d4,d3
  2182.  swap    d3
  2183.  mulu    d1,d3
  2184.  swap    d3
  2185.  move.w  d3,d7
  2186.  andi.l  #$ffff0000,d3
  2187.  add.l   d3,d6
  2188.  move.l  #0,d5
  2189.  addx.l  d5,d7
  2190.  move.l  d4,d3
  2191.  swap    d1
  2192.  mulu    d1,d3
  2193.  swap    d3
  2194.  add.w   d3,d7
  2195.  addx.l  d5,d7
  2196.  andi.l  #$ffff0000,d3
  2197.  add.l   d3,d6
  2198.  addx.l  d5,d7
  2199.  swap    d4
  2200.  swap    d2
  2201.  mulu    d2,d4
  2202.  add.l   d4,d7
  2203.  move.l  62(a7),a0
  2204.  move.w  2(a0),d0
  2205.  btst    #11,d0       ;if the multiply is signed, change the operand
  2206.  beq     UnSigned2     ;size to positive. at the end, adjust the signs
  2207.  move.l  SaveVal(pc),d3
  2208.  btst    #0,d3
  2209.  beq     UnSigned2
  2210.  btst    #10,d0
  2211.  bne     NegD7
  2212.  neg.l   d6
  2213.  bra     UnSigned2
  2214. NegD7:
  2215.  neg.l   d7
  2216. UnSigned2:
  2217.  move.w  d0,d1
  2218.  move.w  d1,d2
  2219.  andi.w  #$7,d0
  2220.  lsr.w   #7,d1
  2221.  lsr.w   #5,d1
  2222.  mulu    #4,d1
  2223.  mulu    #4,d0
  2224.  moveq   #0,d5    ;flag for the size
  2225.  btst    #10,d2
  2226.  beq     Mul32
  2227.  move.l  d7,0(a7,d0)  ;high long word
  2228.  move    SR,d3          ;affect the flags
  2229.  andi.w  #$f,d3
  2230.  move.w  60(a7),d4
  2231.  andi.w  #$fff0,d4
  2232.  or.w    d3,d4
  2233.  move.w  d4,60(a7)
  2234.  bclr    #1,61(a7)   ;no overflow
  2235.  moveq   #1,d5
  2236. Mul32:
  2237.  move.l  d6,0(a7,d1)  ;low long word
  2238.  beq     NoModifi
  2239.  bclr    #2,61(a7) ;if low long word is not zero,then the total is not zero!
  2240. NoModifi:
  2241.  tst.l   d5
  2242.  bne     CCRMulDone
  2243.  tst.l   d6
  2244.  move    SR,d3       ;affect the flags
  2245.  andi.w  #$f,d3
  2246.  move.w  60(a7),d4
  2247.  andi.w  #$fff0,d4
  2248.  or.w    d3,d4
  2249.  move.w  d4,60(a7)
  2250.  tst.l   d7
  2251.  bne     Over32
  2252.  bclr    #1,61(a7)  ;no overflow
  2253.  bra     CCRMulDone
  2254. Over32:
  2255.  bset    #1,61(a7)  ;overflow
  2256. CCRMulDone:
  2257.  movea.l 62(a7),a0
  2258.  adda.l  NumAdd(pc),a0
  2259.  move.l  a0,62(a7)
  2260.  movem.l (a7)+,d0-d7/a0-a6
  2261.  btst    #7,(a7)
  2262.  beq     NT100
  2263.  move.l  $24,-(a7)
  2264.  suba.l  #2,a7
  2265.  move.w  6(a7),(a7)
  2266.  bclr    #7,(a7)
  2267.  bset    #5,(a7)
  2268. NT100:
  2269.  rte
  2270.  
  2271.  
  2272. C_A_S_2:
  2273.  movem.l (a7)+,d0-d7/a0-a6
  2274.  move.l  StackP(pc),-(a7)
  2275.  movem.l d0-d7/a0-a6,-(a7)
  2276.  lea     NumAdd(pc),a3
  2277.  move.l  #6,(a3)
  2278.  move.l  66(a7),a0
  2279.  move.w  (a0),d1
  2280.  move.w  d1,d2
  2281.  andi.w  #$0600,d1
  2282.  lsr.w   #5,d1
  2283.  lsr.w   #4,d1
  2284.  cmpi.w  #2,d1
  2285.  bne     lng2
  2286.  move.w  #3,d1
  2287.  move.w  #1,d3
  2288.  moveq   #2,d7   ; adjust size
  2289.  bra     adjsize2
  2290. lng2:
  2291.  move.w  #2,d1
  2292.  move.w  #2,d3
  2293.  moveq   #0,d7
  2294. adjsize2:
  2295.  lsl.w   #7,d1
  2296.  lsl.w   #5,d1
  2297.  lsl.w   #6,d3      ;d1 for move ,d3 for cmp
  2298.  lea     MoveEffAddr1(pc),a3
  2299.  andi.w  #$cfff,(a3)
  2300.  or.w    d1,(a3)
  2301.  lea     UP1(pc),a3
  2302.  andi.w  #$cfff,(a3)
  2303.  or.w    d1,(a3)
  2304.  lea     Mov21(pc),a3
  2305.  andi.w  #$cfff,(a3)
  2306.  or.w    d1,(a3)
  2307.  lea     Movcas21(pc),a3
  2308.  andi.w  #$cfff,(a3)
  2309.  or.w    d1,(a3)
  2310.  lea     Movcas22(pc),a3
  2311.  andi.w  #$cfff,(a3)
  2312.  or.w    d1,(a3)
  2313.  lea     Comp21(pc),a3
  2314.  andi.w  #$fe3f,(a3)
  2315.  or.w    d3,(a3)
  2316.  lea     MoveEffAddr2(pc),a3
  2317.  andi.w  #$cfff,(a3)
  2318.  or.w    d1,(a3)
  2319.  lea     UP2(pc),a3
  2320.  andi.w  #$cfff,(a3)
  2321.  or.w    d1,(a3)
  2322.  lea     Mov22(pc),a3
  2323.  andi.w  #$cfff,(a3)
  2324.  or.w    d1,(a3)
  2325.  lea     Comp22(pc),a3
  2326.  andi.w  #$fe3f,(a3)
  2327.  or.w    d3,(a3)     
  2328.    ;operand sizes adjusted
  2329.  move.l  66(a7),a0
  2330.  move.w  2(a0),d1
  2331.  move.w  d1,d2
  2332.  andi.w  #$7000,d1
  2333.  lsr.w   #7,d1
  2334.  lsr.w   #5,d1
  2335.  mulu    #4,d1
  2336.  btst    #15,d2
  2337.  beq     Cas1
  2338.  add.l   #32,d1
  2339. Cas1:
  2340.  move.l  0(a7,d1),d5  ;d5 has the address
  2341.  move.l  d5,a4
  2342.  lea     Val1(pc),a3
  2343. MoveEffAddr1:
  2344.  move.l  (a4),(a3)   ;save (r1) in Val1
  2345.  move.l  66(a7),a0
  2346.  move.w  4(a0),d1
  2347.  move.w  d1,d2
  2348.  andi.w  #$7000,d1
  2349.  lsr.w   #7,d1
  2350.  lsr.w   #5,d1
  2351.  mulu    #4,d1
  2352.  btst    #15,d2
  2353.  beq     Cas2
  2354.  add.l   #32,d1
  2355. Cas2:
  2356.  move.l  0(a7,d1),d6
  2357.  movea.l d6,a4
  2358.  lea     Val2(pc),a3
  2359. MoveEffAddr2:
  2360.  move.l  (a4),(a3)   ;save (r2) in Val2
  2361.  move.l  66(a7),a0
  2362.  move.w  2(a0),d1
  2363.  andi.w  #$7,d1
  2364.  mulu    #4,d1
  2365.  move.l  0(a7,d1),d0
  2366. Movcas21:
  2367.  move.l  Val1(pc),d1
  2368. Comp21:
  2369.  cmp.l   d0,d1    ;compare savea1 to dc
  2370.  lea     SaveVal(pc),a3
  2371.  move    SR,(a3)
  2372.  bne     NotEQ21
  2373.  move.l  66(a7),a0
  2374.  move.w  4(a0),d1
  2375.  andi.w  #$7,d1
  2376.  mulu    #4,d1
  2377.  move.l  0(a7,d1),d0
  2378. Movcas22:
  2379.  move.l  Val2(pc),d1
  2380. Comp22:
  2381.  cmp.l   d0,d1    ;compare savea1 to dc2
  2382.  lea     SaveVal(pc),a3
  2383.  move    SR,(a3)
  2384.  bne     NotEQ21
  2385.  move.l  66(a7),a0
  2386.  move.w  2(a0),d1
  2387.  andi.w  #$01c0,d1
  2388.  lsr.w   #6,d1
  2389.  mulu    #4,d1
  2390.  add.l   d7,d1
  2391.  move.l  d5,a3
  2392. Mov21:
  2393.  move.l  0(a7,d1),(a3)     ;move du1 to (r1)
  2394.  move.l  66(a7),a0
  2395.  move.w  4(a0),d1
  2396.  andi.w  #$01c0,d1
  2397.  lsr.w   #6,d1
  2398.  mulu    #4,d1
  2399.  add.l   d7,d1
  2400.  move.l  d6,a3  
  2401. Mov22:
  2402.  move.l  0(a7,d1),(a3)     ;move du2 to (r2)
  2403.  bra     CASDone21
  2404. NotEQ21:
  2405.  move.l  66(a7),a0
  2406.  move.w  2(a0),d1
  2407.  andi.w  #$7,d1
  2408.  mulu    #4,d1
  2409.  add.l   d7,d1
  2410.  move.l  d5,a3 
  2411. UP1:
  2412.  move.l  (a3),0(a7,d1)      ;(r1) to dc1
  2413. NotEQ22:
  2414.  move.l  66(a7),a0
  2415.  move.w  4(a0),d1
  2416.  andi.w  #$7,d1
  2417.  mulu    #4,d1
  2418.  add.l   d7,d1
  2419.  move.l  d6,a3
  2420. UP2:
  2421.  move.l  (a3),0(a7,d1)  
  2422. CASDone21:
  2423.  move.w  SaveVal(pc),d3
  2424.  andi.l  #$f,d3
  2425.  move.w  64(a7),d2
  2426.  andi.w  #$fff0,d2
  2427.  or.w    d2,d3
  2428.  move.w  d3,64(a7)
  2429.  move.l  66(a7),d4
  2430.  add.l   NumAdd(pc),d4
  2431.  move.l  d4,66(a7)
  2432.  move.l  ExecBase,a6
  2433.  jsr     Permit(a6)
  2434.  movem.l (a7)+,d0-d7/a0-a6
  2435.  adda.l  #4,a7
  2436.  btst    #7,(a7)
  2437.  beq     NT110
  2438.  move.l  $24,-(a7)
  2439.  suba.l  #2,a7
  2440.  move.w  6(a7),(a7)
  2441.  bclr    #7,(a7)
  2442.  bset    #5,(a7)
  2443. NT110:
  2444.  rte
  2445.  
  2446.  
  2447.  
  2448. C_A_S:
  2449.  move.l  62(a7),a0
  2450.  move.w  (a0),d1
  2451.  move.w  d1,d2
  2452.  andi.w  #$0600,d1
  2453.  lsr.w   #5,d1
  2454.  lsr.w   #4,d1
  2455.  move.w  #0,d3
  2456.  cmpi.w  #1,d1
  2457.  beq     adjsize
  2458. longword:
  2459.  cmpi.w  #2,d1
  2460.  bne     lng
  2461.  move.w  #3,d1
  2462.  move.w  #1,d3
  2463.  bra     adjsize
  2464. lng:
  2465.  move.w  #2,d1
  2466.  move.w  #2,d3
  2467. adjsize:
  2468.  lsl.w   #7,d1
  2469.  lsl.w   #5,d1
  2470.  lsl.w   #6,d3
  2471.  lea     EffAddr(pc),a3
  2472.  andi.w  #$cfff,(a3)
  2473.  or.w    d1,(a3)
  2474.  lea     NotEQ(pc),a3
  2475.  andi.w  #$cfff,(a3)
  2476.  or.w    d1,(a3)
  2477.  lea     Mov(pc),a3
  2478.  andi.w  #$cfff,(a3)
  2479.  or.w    d1,(a3)
  2480.  lea     Comp(pc),a3
  2481.  andi.w  #$fe3f,(a3)
  2482.  or.w    d3,(a3)
  2483.  lea     Movd01(pc),a3
  2484.  andi.w  #$cfff,(a3)
  2485.  or.w    d1,(a3)
  2486.  lea     Movd02(pc),a3
  2487.  andi.w  #$cfff,(a3)
  2488.  or.w    d1,(a3)      ;operand sizes adjustecd
  2489.  
  2490.  move.w  d2,d1
  2491.  andi.w  #$003f,d1
  2492.  lea     EffAddr(pc),a3
  2493.  andi.w  #$ffc0,(a3)
  2494.  or.w    d1,(a3)
  2495.  lea     NotEQ(pc),a3
  2496.  andi.w  #$ffc0,(a3)
  2497.  or.w    d1,(a3)
  2498.  andi.w  #$7,d1
  2499.  andi.w  #$38,d2
  2500.  lsl.w   #2,d1
  2501.  lsl.w   #7,d1
  2502.  lsl.w   #3,d2
  2503.  or.w    d2,d1
  2504.  lea     Mov(pc),a3
  2505.  lea     NumAdd(pc),a4
  2506.  lea     NotEQ(pc),a5
  2507.  move.l  #$4e714e71,2(a3)
  2508.  lea     EffAddr(pc),a6
  2509.  move.l  #$4e714e71,2(a6)
  2510.  andi.w  #$f03f,(a3)
  2511.  or.w    d1,(a3)
  2512.  lsr.w   #6,d2
  2513.  cmpi.w  #$5,d2
  2514.  bne     tst21
  2515.  move.l  #6,(a4)       ;it is address reg. indirect with displ.
  2516.  move.w  4(a0),2(a3)
  2517.  move.w  4(a0),2(a6)
  2518.  move.w  4(a0),2(a5)
  2519.  bra     Here71
  2520. tst21:
  2521.  cmpi.w  #$6,d2
  2522.  bne     tst31
  2523.  move.w  4(a0),d3
  2524.  btst    #8,d3
  2525.  beq     her12
  2526.  lea     BDFlag(pc),a3
  2527.  move.l  #0,(a3)
  2528.  lea     her11(pc),a3
  2529.  lea     Val2(pc),a4
  2530.  move.l  a3,(a4)
  2531.  lea     Offset(pc),a3
  2532.  move.l  #4,(a3)
  2533.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  2534. her11:
  2535.  lea     Mov(pc),a3      ;Modify necessary insructions
  2536.  lea     NotEQ(pc),a5
  2537.  lea     EffAddr(pc),a6
  2538.  move.l  RetAddr(pc),2(a3)
  2539.  move.l  RetAddr(pc),2(a6)
  2540.  move.l  RetAddr(pc),2(a5)
  2541.  andi.w  #$ffc0,(a3)
  2542.  ori.w   #$0039,(a3)
  2543.  andi.w  #$ffc0,(a5)
  2544.  ori.w   #$0039,(a5)
  2545.  andi.w  #$ffc0,(a6)
  2546.  ori.w   #$0039,(a6)
  2547.  bra     Here71  
  2548. her12:
  2549.  lea     NumAdd(pc),a4
  2550.  move.l  #6,(a4)
  2551.  lea     BDFlag(pc),a3
  2552.  move.l  #0,(a3)
  2553.  lea     her21(pc),a3
  2554.  lea     Val2(pc),a4
  2555.  move.l  a3,(a4)
  2556.  lea     Offset(pc),a3
  2557.  move.l  #4,(a3)
  2558.  bra     BriefFormat         ;it is a 68020 addressing mode
  2559. her21:
  2560.  lea     Mov(pc),a3
  2561.  lea     NotEQ(pc),a5
  2562.  lea     EffAddr(pc),a6
  2563.  move.l  RetAddr(pc),2(a3)
  2564.  move.l  RetAddr(pc),2(a6)
  2565.  move.l  RetAddr(pc),2(a5)
  2566.  andi.w  #$ffc0,(a3)
  2567.  ori.w   #$0039,(a3)
  2568.  andi.w  #$ffc0,(a5)
  2569.  ori.w   #$0039,(a5)
  2570.  andi.w  #$ffc0,(a6)
  2571.  ori.w   #$0039,(a6)
  2572.  bra     Here71  
  2573. tst31:
  2574.  lsr.w   #6,d1
  2575.  cmpi.w  #$7,d1
  2576.  bne     tst41
  2577.  move.l  #6,(a4)
  2578.  move.w  4(a0),2(a3)
  2579.  move.w  4(a0),2(a6)
  2580.  move.w  4(a0),2(a5)
  2581.  bra     Here71
  2582. tst41:
  2583.  cmpi.w  #$f,d1
  2584.  bne     tst51
  2585.  move.l  #8,(a4)
  2586.  move.l  4(a0),2(a3)
  2587.  move.l  4(a0),2(a6)
  2588.  move.l  4(a0),2(a5)
  2589.  bra     Here71
  2590. tst51:
  2591.  move.l  #4,(a4)
  2592. Here71:
  2593.  move.l  62(a7),a0
  2594.  move.w  2(a0),d4
  2595.  move.w  d4,d5
  2596.  andi.w  #$7,d4
  2597.  lsl.w   #7,d4
  2598.  lsl.w   #2,d4
  2599.  lea     NotEQ(pc),a3
  2600.  andi.w  #$f1ff,(a3)
  2601.  or.w    d4,(a3)
  2602.  andi.w  #$01c0,d5
  2603.  lsr.w   #6,d5
  2604.  lea     Mov(pc),a3
  2605.  andi.w  #$fff8,(a3)
  2606.  or.w    d5,(a3)
  2607.  lea     SaveVal(pc),a3
  2608.  move.l  #0,(a3)
  2609.  lea     SaveA7(pc),a3
  2610.  move.l  a7,(a3)
  2611.  movem.l (a7)+,d0-d7/a0-a6
  2612.  lea     saved0(pc),a7
  2613.  move.l  d0,(a7)
  2614.  move.l  StackP(pc),a7
  2615. EffAddr:
  2616.  move.l  d0,d0     ;move <ea> to savea1
  2617.  nop
  2618.  nop
  2619.  lea     savea1(pc),a7
  2620. Movd01:
  2621.  move.l  d0,(a7)     ;place the operand in savea1
  2622.  move.l  saved0(pc),d0
  2623.  move.l  SaveA7(pc),a7
  2624.  adda.l  #60,a7
  2625.  movem.l d0-d7/a0-a6,-(a7)
  2626.  move.l  62(a7),a0
  2627.  move.w  2(a0),d0
  2628.  andi.w  #7,d0
  2629.  mulu    #4,d0
  2630.  move.l  0(a7,d0),d1
  2631. Movd02:
  2632.  move.l  savea1(pc),d0
  2633. Comp:
  2634.  cmp.l   d1,d0    ;compare savea1 to dc
  2635.  lea     SaveVal(pc),a3
  2636.  move    SR,(a3)
  2637.  lea     SaveA7(pc),a3
  2638.  move.l  a7,(a3)
  2639.  movem.l (a7)+,d0-d7/a0-a6
  2640.  lea     saved1(pc),a7
  2641.  move.l  d1,(a7)
  2642.  move.w  SaveVal(pc),d1
  2643.  btst    #2,d1      ; Z = 0?
  2644.  beq     NE
  2645.  move.l  StackP(pc),a7
  2646.  move.l  saved1(pc),d1
  2647. Mov:
  2648.  move.l  d0,d0     ;move du to <ea>
  2649.  nop
  2650.  nop
  2651.  bra     CASDone
  2652. NE:
  2653.  move.l  saved1(pc),d1
  2654. NotEQ:
  2655.  move.l  d0,d1      ;d0 to <ea>, d1 to dc
  2656.  nop
  2657.  nop
  2658. CASDone:
  2659.  move.l  SaveA7(pc),a7
  2660.  adda.l  #60,a7
  2661.  movem.l d0-d7/a0-a6,-(a7)
  2662.  move.w  SaveVal(pc),d3
  2663.  andi.w  #$000f,d3
  2664.  move.w  60(a7),d2
  2665.  andi.w  #$fff0,d2
  2666.  or.w    d2,d3
  2667.  move.w  d3,60(a7)
  2668.  move.l  62(a7),d4
  2669.  add.l   NumAdd(pc),d4
  2670.  move.l  d4,62(a7)
  2671.  move.l  ExecBase,a6
  2672.  jsr     Permit(a6)
  2673.  movem.l (a7)+,d0-d7/a0-a6
  2674.  btst    #7,(a7)
  2675.  beq     NT120
  2676.  move.l  $24,-(a7)
  2677.  suba.l  #2,a7
  2678.  move.w  6(a7),(a7)
  2679.  bclr    #7,(a7)
  2680.  bset    #5,(a7)
  2681. NT120:
  2682.  rte
  2683.  
  2684.   
  2685.  
  2686.  
  2687. U_N_P_K:
  2688.  move.l  62(a7),a0
  2689.  move.w  (a0),d1
  2690.  move.w  d1,d2
  2691.  andi.w  #$8,d1
  2692.  beq     datareg
  2693.  move.w  #32,d3
  2694.  bra     lab10
  2695. datareg:
  2696.  move.w  #0,d3
  2697. lab10:
  2698.  move.w  d2,d1
  2699.  andi.w  #$7,d1 
  2700.  or.w    d3,d1     ;get source
  2701.  lea     Source(pc),a1
  2702.  andi.w  #$ffc0,(a1)
  2703.  or.w    d1,(a1)
  2704.  move.w  d2,d1
  2705.  andi.w  #$0e00,d1
  2706.  lsl.w   #3,d3
  2707.  or.w    d3,d1
  2708.  lea     Dest(pc),a1
  2709.  andi.w  #$f03f,(a1)
  2710.  or.w    d1,(a1)
  2711.  lea     SaveA7(pc),a3
  2712.  move.l  a7,(a3)
  2713.  movem.l (a7)+,d0-d7/a0-a6
  2714.  lea     saved1(pc),a7
  2715.  move.l  d1,(a7)
  2716.  move.l  StackP(pc),a7
  2717. Source:
  2718.  move.b  d0,d1; move.b  d0,(a7)
  2719.  lea     SaveVal(pc),a7
  2720.  move.b  d1,(a7)
  2721.  move.l  saved1(pc),d1
  2722.  move.l  SaveA7(pc),a7
  2723.  adda.l  #60,a7
  2724.  movem.l d0-d7/a0-a6,-(a7)
  2725.  move.b  SaveVal(pc),d5
  2726.  move.w  d5,d4
  2727.  andi.w  #$000f,d5
  2728.  andi.w  #$00f0,d4
  2729.  lsl.w   #4,d4
  2730.  or.w    d4,d5
  2731.  move.l  62(a7),a0
  2732.  move.w  2(a0),d1
  2733.  add.w   d1,d5
  2734.  lea     Dest(pc),a3
  2735.  move.w  d5,2(a3)
  2736.  lea     SaveA7(pc),a3
  2737.  move.l  a7,(a3)
  2738.  movem.l (a7)+,d0-d7/a0-a6
  2739.  move.l  StackP(pc),a7
  2740. Dest:
  2741.  move.w  #$0000,d0
  2742.  move.l  SaveA7(pc),a7
  2743.  adda.l  #60,a7
  2744.  movem.l d0/d1/a0/a1/a6,-(a7)
  2745.  move.l  ExecBase,a6
  2746.  jsr     Permit(a6)
  2747.  move.l  22(a7),d0
  2748.  add.l   #4,d0
  2749.  move.l  d0,22(a7)
  2750.  movem.l (a7)+,d0/d1/a0/a1/a6
  2751.  btst    #7,(a7)
  2752.  beq     NT130
  2753.  move.l  $24,-(a7)
  2754.  suba.l  #2,a7
  2755.  move.w  6(a7),(a7)
  2756.  bclr    #7,(a7)
  2757.  bset    #5,(a7)
  2758. NT130:
  2759.  rte
  2760.  
  2761.  
  2762.  
  2763. P_A_C_K:
  2764.  move.l  62(a7),a0
  2765.  move.w  (a0),d1
  2766.  move.w  d1,d2
  2767.  andi.w  #$8,d1
  2768.  beq     datareg20
  2769.  move.w  #32,d3
  2770.  bra     lab100
  2771. datareg20:
  2772.  move.w  #0,d3
  2773. lab100:
  2774.  move.w  d2,d1
  2775.  andi.w  #$7,d1 
  2776.  or.w    d3,d1    ;get source
  2777.  lea     Source20(pc),a1
  2778.  andi.w  #$ffc0,(a1)
  2779.  or.w    d1,(a1)
  2780.  move.w  d2,d1
  2781.  andi.w  #$0e00,d1
  2782.  lsl.w   #3,d3
  2783.  or.w    d3,d1
  2784.  lea     Dest20(pc),a1
  2785.  andi.w  #$f03f,(a1)
  2786.  or.w    d1,(a1)
  2787.  lea     SaveA7(pc),a3
  2788.  move.l  a7,(a3)
  2789.  movem.l (a7)+,d0-d7/a0-a6
  2790.  lea     saved1(pc),a7
  2791.  move.l  d1,(a7)
  2792.  move.l  StackP(pc),a7
  2793. Source20:
  2794.  move.w  d0,d1     ; move.w  d0,(a7)
  2795.  lea     SaveVal(pc),a7
  2796.  move.w  d1,(a7)
  2797.  move.l  saved1(pc),d1
  2798.  move.l  SaveA7(pc),a7
  2799.  adda.l  #60,a7
  2800.  movem.l d0-d7/a0-a6,-(a7)
  2801.  move.w  SaveVal(pc),d5
  2802.  move.l  62(a7),a0
  2803.  move.w  2(a0),d1
  2804.  add.w   d1,d5
  2805.  move.w  d5,d6
  2806.  andi.w  #$0f00,d6
  2807.  lsr.w   #4,d6
  2808.  andi.w  #$000f,d5
  2809.  or.w    d6,d5
  2810.  lea     Dest20(pc),a3
  2811.  move.w  d5,2(a3)
  2812.  lea     SaveA7(pc),a3
  2813.  move.l  a7,(a3)
  2814.  movem.l (a7)+,d0-d7/a0-a6
  2815.  move.l  StackP(pc),a7
  2816. Dest20:
  2817.  move.b  #00,d0
  2818.  move.l  SaveA7(pc),a7
  2819.  adda.l  #60,a7
  2820.  movem.l d0/d1/a0/a1/a6,-(a7)
  2821.  move.l  ExecBase,a6
  2822.  jsr     Permit(a6)
  2823.  move.l  22(a7),d0
  2824.  add.l   #4,d0
  2825.  move.l  d0,22(a7)
  2826.  movem.l (a7)+,d0/d1/a0/a1/a6
  2827.  btst    #7,(a7)
  2828.  beq     NT140
  2829.  move.l  $24,-(a7)
  2830.  suba.l  #2,a7
  2831.  move.w  6(a7),(a7)
  2832.  bclr    #7,(a7)
  2833.  bset    #5,(a7)
  2834. NT140:
  2835.  rte
  2836.  
  2837.  
  2838.  
  2839.  
  2840. L_I_N_K_L:
  2841.  move.l  62(a7),a0
  2842.  move.w  (a0),d1
  2843.  andi.w  #$0007,d1
  2844.  lea     RetAddr(pc),a3
  2845.  move.l  62(a7),(a3)
  2846.  lea     MySR(pc),a3
  2847.  move.w  60(a7),d0
  2848.  move.w  d0,(a3)
  2849.  btst    #13,d0
  2850.  bne     SuperS1        ;supervisor or user stack?
  2851.  move    USP,a1
  2852.  lea     savea1(pc),a3  ;save USP
  2853.  move.l  a1,(a3)
  2854.  suba.l  #4,a1
  2855.  lea     MySP(pc),a3
  2856.  move    a1,USP
  2857.  move.l  a1,(a3)
  2858.  bra     DoOr
  2859. SuperS1:
  2860.  lea     savea1(pc),a3
  2861.  move.l  a7,d5
  2862.  move.l  d5,(a3)
  2863.  add.l   #66,(a3)    ;66 - 4 = 62
  2864.  lea     MySP(pc),a3
  2865.  move.l  d5,(a3)
  2866.  add.l   #62,(a3)
  2867. DoOr:
  2868.  cmpi.w  #1,d1
  2869.  beq     lab2
  2870.  lea     mova1(pc),a2
  2871.  andi.w  #$fff8,(a2)
  2872.  or.w    d1,(a2)+
  2873.  lsl.w   #7,d1
  2874.  lsl.w   #2,d1
  2875.  andi.w  #$f0ff,(a2)
  2876.  or.w    d1,(a2)
  2877.  lea     SaveA7(pc),a3
  2878.  move.l  a7,(a3)            ;save a7
  2879.  movem.l (a7)+,d0-d7/a0-a6
  2880.  lea     saved1(pc),a7
  2881.  move.l  a1,(a7)
  2882.  movea.l savea1(pc),a1
  2883. mova1:
  2884.  move.l  a0,-(a1)
  2885.  movea.l MySP(pc),a0
  2886.  movea.l saved1(pc),a1
  2887.  bra     lab1
  2888. lab2:
  2889.  lea     SaveA7(pc),a3
  2890.  move.l  a7,(a3)            ;save a7
  2891.  movem.l (a7)+,d0-d7/a0-a6
  2892.  lea     saved1(pc),a7
  2893.  move.l  a0,(a7)
  2894.  movea.l savea1(pc),a0
  2895. mova0:
  2896.  move.l  a1,-(a0)
  2897.  movea.l MySP(pc),a1
  2898.  movea.l saved1(pc),a0
  2899. lab1:
  2900.  movea.l SaveA7(pc),a7
  2901.  adda.l  #60,a7
  2902.  movem.l d0-d7/a0-a6,-(a7)
  2903.  movea.l RetAddr(pc),a0
  2904.  adda.l  #2,a0
  2905.  move.l  (a0),d1
  2906.  move.w  MySR(pc),d3
  2907.  btst    #13,d3
  2908.  bne     SuperS2
  2909.  move    USP,a1
  2910.  adda.l  d1,a1
  2911.  move    a1,USP
  2912.  bra     fin
  2913. SuperS2:
  2914.  lea     saved1(pc),a3
  2915.  move.l  d1,(a3)
  2916.  movem.l (a7)+,d0-d7/a0-a6
  2917.  move.l  MySP(pc),a7
  2918.  adda.l  saved1(pc),a7
  2919.  move.l  RetAddr(pc),-(a7)
  2920.  add.l   #6,(a7)           ;link.l requires 6 bytes.
  2921.  move.w  MySR(pc),-(a7)
  2922.  movem.l d0/d1/a0/a1/a6,-(a7)
  2923.  move.l  ExecBase,a6
  2924.  jsr     Permit(a6)
  2925.  movem.l (a7)+,d0/d1/a0/a1/a6
  2926.  btst    #7,(a7)
  2927.  beq     NT150
  2928.  move.l  $24,-(a7)
  2929.  suba.l  #2,a7
  2930.  move.w  6(a7),(a7)
  2931.  bclr    #7,(a7)
  2932.  bset    #5,(a7)
  2933. NT150:
  2934.  rte
  2935.  
  2936. fin:
  2937.  move.l  RetAddr(pc),d0
  2938.  add.l   #6,d0
  2939.  move.l  d0,62(a7)
  2940.  move.w  MySR(pc),d0
  2941.  move.w  d0,60(a7)
  2942.  move.l  ExecBase,a6
  2943.  jsr     Permit(a6)
  2944.  movem.l (a7)+,d0-d7/a0-a6
  2945.  btst    #7,(a7)
  2946.  beq     NT160
  2947.  move.l  $24,-(a7)
  2948.  suba.l  #2,a7
  2949.  move.w  6(a7),(a7)
  2950.  bclr    #7,(a7)
  2951.  bset    #5,(a7)
  2952. NT160:
  2953.  rte
  2954.  
  2955.  
  2956. T_R_A_P_C_C:
  2957.  move.l  62(a7),a0
  2958.  move.w  (a0),d0
  2959.  move.w  d0,d4
  2960.  andi.w  #$0f00,d0
  2961.  lea     bcond(pc),a1
  2962.  andi.w  #$f0ff,(a1)
  2963.  or.w    d0,(a1)
  2964.  andi.w  #$0007,d4
  2965.  cmpi.w  #4,d4       ;has a operand
  2966.  bne     HasOp
  2967.  moveq   #2,d6
  2968.  bra     OpFound
  2969. HasOp:
  2970.  cmpi.w  #2,d4    ;is the operand word?
  2971.  bne     long
  2972.  moveq   #4,d6
  2973.  bra     OpFound
  2974. long:
  2975.  cmpi.w  #3,d4
  2976.  beq     Found
  2977.  bra     illegale
  2978. Found:
  2979.  moveq   #6,d6
  2980. OpFound:
  2981.  cmpi.w  #$0100,d0      ;is it trapf?
  2982.  beq     Exit1
  2983.  cmpi.w  #$0000,d0    ;is it trapt?
  2984.  beq     GoTrap
  2985.  move.w  60(a7),d0
  2986.  move    d0,ccr
  2987.  nop               ;force the cpu to use the original status register
  2988. bcond:
  2989.  bcs     GoTrap
  2990. Exit1:
  2991.  move.l  62(a7),d4         
  2992.  add.l   d6,d4
  2993.  move.l  d4,62(a7)
  2994.  move.l  ExecBase,a6
  2995.  jsr     Permit(a6)
  2996.  movem.l (a7)+,d0-d7/a0-a6
  2997.  btst    #7,(a7)
  2998.  beq     NT170
  2999.  move.l  $24,-(a7)
  3000.  suba.l  #2,a7
  3001.  move.w  6(a7),(a7)
  3002.  bclr    #7,(a7)
  3003.  bset    #5,(a7)
  3004. NT170:
  3005.  rte 
  3006.  
  3007. GoTrap:
  3008.  move.l  62(a7),d2
  3009.  add.l   d6,d2
  3010.  move.l  d2,62(a7)
  3011.  move.l  ExecBase,a6
  3012.  jsr     Permit(a6)
  3013.  movem.l (a7)+,d0-d7/a0-a6
  3014.  move.l  $1c,-(a7)     ;place address of original except handler
  3015.  suba.l  #2,a7                  ;as return address on the stack
  3016.  move.w  $6(a7),(a7)
  3017.  bset    #5,(a7)
  3018.  bclr    #7,(a7)
  3019.  rte
  3020.  
  3021.  
  3022.  
  3023.  
  3024. E_X_T_B:
  3025.  move.l  62(a7),a0
  3026.  move.w  (a0),d5
  3027.  andi.w  #$7,d5
  3028.  mulu    #4,d5
  3029.  move.l  0(a7,d5),d2  ;get the operand in d2
  3030.  ext.w   d2
  3031.  ext.l   d2          ;extend it
  3032.  move    SR,d0
  3033.  andi.w  #$000f,d0
  3034.  move.w  60(a7),d1
  3035.  andi.w  #$fff0,d1
  3036.  or.w    d0,d1
  3037.  move.w  d1,60(a7)
  3038.  move.l  d2,0(a7,d5)
  3039.  move.l  62(a7),d4         ;get the address of the extb.l instruction
  3040.  add.l   #2,d4       ;add 2 so that execution begins with the next opcode
  3041.  move.l  d4,62(a7)
  3042.  move.l  ExecBase,a6
  3043.  jsr     Permit(a6)
  3044.  movem.l (a7)+,d0-d7/a0-a6
  3045.  btst    #7,(a7)
  3046.  beq     NT180
  3047.  move.l  $24,-(a7)
  3048.  suba.l  #2,a7
  3049.  move.w  6(a7),(a7)
  3050.  bclr    #7,(a7)
  3051.  bset    #5,(a7)
  3052. NT180:
  3053.  rte
  3054.  
  3055.  
  3056. R_T_D:      ;Syntax: rtd  #<data>
  3057.  move.l  62(a7),a0
  3058.  moveq   #0,d0
  3059.  move.w  2(a0),d0    ;d0 = #<data>
  3060.  ext.l   d0
  3061.  move.w  60(a7),d1
  3062.  btst    #13,d1         ;which stack we were using befor the exception?
  3063.  bne     SuperStack
  3064.  move.l  USP,a6
  3065.  move.l  (a6)+,62(a7)  ;place return address on the usp as the except return
  3066.  adda.l  d0,a6        ;address on top of the ssp so we'll return there
  3067.                ;then add  the number of bytes appropriate to the usp
  3068.  move.l  a6,USP
  3069.  bra     EndIt
  3070. SuperStack:
  3071.  move.l  a7,a6
  3072.  adda.l  #70,a6 ;60=15 regs*4,2 for SR,4 for illegal inst,addr,4for ret addr
  3073.  adda.l  d0,a6
  3074.  move.l  66(a7),-(a6)  ;retun address for rtd
  3075.  move.w  60(a7),-(a6)  ;SR
  3076.  move.l  #14,d4       ;15 regs
  3077.  adda.l  #60,a7
  3078. cop:
  3079.  move.l  -(a7),-(a6)
  3080.  dbra    d4,cop
  3081.  move.l  a6,a7
  3082. EndIt:
  3083.  move.l  ExecBase,a6
  3084.  jsr     Permit(a6)
  3085.  movem.l (a7)+,d0-d7/a0-a6
  3086.  btst    #7,(a7)
  3087.  beq     NT190
  3088.  move.l  $24,-(a7)
  3089.  suba.l  #2,a7
  3090.  move.w  6(a7),(a7)
  3091.  bclr    #7,(a7)
  3092.  bset    #5,(a7)
  3093. NT190:
  3094.  rte
  3095.  
  3096.  
  3097. M_O_V_E_C:   ;Syntax:movec CR,Rn or movec Rn,CR (CR=a control register)
  3098.  movem.l (a7)+,d0-d7/a0-a6
  3099.  move.l  StackP(pc),-(a7)
  3100.  movem.l d0-d7/a0-a6,-(a7)
  3101.  move.l  66(a7),a0
  3102.  move.w  (a0),d3  ;this is the illegal instruction
  3103.  btst    #0,d3
  3104.  bne     ToCR
  3105.  move.w  2(a0),d3
  3106.  move.w  d3,d4
  3107.  andi.w  #$7000,d3
  3108.  lsr.w   #7,d3
  3109.  lsr.w   #5,d3    ;d3 has the register number
  3110.  mulu    #4,d3
  3111.  btst    #15,d4
  3112.  beq     DatReg
  3113.  add.l   #32,d3
  3114. DatReg:
  3115.  andi.w  #$0fff,d4     ;get the control register
  3116.  cmpi.w  #$0,d4        ;is it SFC?
  3117.  bne     nextt1
  3118.  movea.l MySFC(pc),a1     ;put its contents in a1
  3119.  bra     Here1
  3120. nextt1:
  3121.  cmpi.w  #$0001,d4     ;is it DFC?
  3122.  bne     nextt2
  3123.  movea.l MyDFC(pc),a1    ;put it in a1
  3124.  bra     Here1
  3125. nextt2:
  3126.  cmpi.w  #$0800,d4     ;is it USP?
  3127.  bne     nextt3
  3128.  move    USP,a1        ;put it in a1
  3129.  bra     Here1
  3130. nextt3:
  3131.  cmpi.w  #$0002,d4     ;is it CACR?
  3132.  bne     nextt4
  3133.  movea.l MyCACR(pc),a1        ;put it in a1
  3134.  bra     Here1
  3135. nextt4:
  3136.  cmpi.w  #$0802,d4     ;is it CAAR?
  3137.  bne     nextt5
  3138.  movea.l MyCAAR(pc),a1        ;put it in a1
  3139.  bra     Here1
  3140. nextt5:
  3141.  cmpi.w  #$0803,d4     ;is it MSP?
  3142.  beq     ssp1
  3143.  cmpi.w  #$0804,d4    ;or ISP?
  3144.  bne     nextt6
  3145. ssp1:
  3146.  movea.l a7,a1
  3147.  adda.l  #70,a1       ;don't consider the pushed registers!
  3148.  bra     Here1
  3149. nextt6:
  3150.  cmpi.w  #$0801,d4    ;is it VBR ?
  3151.  beq     mvbr
  3152.  movem.l (a7)+,d0-d7/a0-a6
  3153.  adda.l  #4,a7
  3154.  movem.l d0-d7/a0-a6,-(a7)
  3155.  bra     illegale
  3156. mvbr:
  3157.  movea.l MyVBR(pc),a1    ; put it in a1
  3158. Here1:
  3159.  move.l  a1,0(a7,d3)   ;put in actual reg.putting in a7 has no effect
  3160.  move.l  66(a7),d4         ;get the address of the movec instruction
  3161.  add.l   #4,d4       ;add 4 so that execution begins with the next opcode
  3162.  move.l  d4,66(a7)
  3163.  move.l  ExecBase,a6
  3164.  jsr     Permit(a6)
  3165.  movem.l (a7)+,d0-d7/a0-a6
  3166.  adda.l  #4,a7
  3167.  btst    #7,(a7)
  3168.  beq     NT200
  3169.  move.l  $24,-(a7)
  3170.  suba.l  #2,a7
  3171.  move.w  6(a7),(a7)
  3172.  bclr    #7,(a7)
  3173.  bset    #5,(a7)
  3174. NT200:
  3175.  rte
  3176.  
  3177. ToCR:
  3178.  move.w  2(a0),d3
  3179.  move.w  d3,d4
  3180.  andi.w  #$7000,d3
  3181.  lsr.w   #7,d3
  3182.  lsr.w   #5,d3
  3183.  mulu    #4,d3
  3184.  btst    #15,d4
  3185.  beq     DatReg2
  3186.  add.l   #32,d3
  3187. DatReg2:
  3188.  move.l  0(a7,d3),d1    ;get the value in d1
  3189.  lea     saved1(pc),a3
  3190.  move.l  d1,(a3)
  3191.  movem.l (a7)+,d0-d7/a0-a6
  3192.  adda.l  #4,a7
  3193.  movem.l d0-d7/a0-a6,-(a7)
  3194.  move.l  saved1(pc),d1
  3195.  move.l  62(a7),a0
  3196.  move.w  2(a0),d4
  3197.  andi.w  #$0fff,d4
  3198.  cmpi.w  #$0,d4
  3199.  bne     nextr1
  3200.  lea     MySFC(pc),a3
  3201.  andi.l  #$7,d1
  3202.  move.l  d1,(a3)
  3203.  bra     here2
  3204. nextr1:
  3205.  cmpi.w  #$0001,d4
  3206.  bne     nextr2
  3207.  lea     MyDFC(pc),a3
  3208.  andi.l  #$7,d1
  3209.  move.l  d1,(a3)
  3210.  bra     here2
  3211. nextr2:
  3212.  cmpi.w  #$0800,d4
  3213.  bne     nextr3
  3214.  movea.l d1,a2
  3215.  move    a2,USP
  3216. nextr3:
  3217.  cmpi.w  #$0002,d4
  3218.  bne     nextr4
  3219.  lea     MyCACR(pc),a3
  3220.  andi.l  #$f,d1
  3221.  move.l  d1,(a3)
  3222.  bra     here2
  3223. nextr4:
  3224.  cmpi.w  #$0802,d4
  3225.  bne     nextr5
  3226.  lea     MyCAAR(pc),a3
  3227.  move.l  d1,(a3)
  3228.  bra     here2
  3229. nextr5:
  3230.  cmpi.w  #$0803,d4
  3231.  beq     ssp2
  3232.  cmpi.w  #$0804,d4
  3233.  bne     nextr6
  3234. ssp2:
  3235.  lea     saved1(pc),a3
  3236.  move.l  d1,(a3)
  3237.  lea     SaveA7(pc),a3
  3238.  move.l  a7,(a3)
  3239.  movem.l (a7)+,d0-d7/a0-a6
  3240.  lea     savea1(pc),a7
  3241.  move.l  a1,(a7)
  3242.  move.l  saved1(pc),a1
  3243.  move.l  SaveA7(pc),a7
  3244.  adda.l  #60,a7
  3245.  move.l  2(a7),-(a1)   ;return address
  3246.  move.w  (a7),-(a1)   ;status register
  3247.  move.l  a1,a7
  3248.  move.l  savea1(pc),a1
  3249.  movem.l d0-d7/a0-a6,-(a7)
  3250.  bra     here2
  3251. nextr6:
  3252.  cmpi.w  #$0801,d4
  3253.  bne     illegale
  3254. mvbr2:
  3255.  lea     MyVBR(pc),a3
  3256.  move.l  d1,(a3)
  3257.  bne     NotZero   ;if new address not zero then copy the 1024 bytes at the
  3258.  movea.l #0,a5         ;VBR address to the locations 0-1024
  3259.  movea.l NewVec(pc),a4
  3260.  move.l  #511,d4
  3261. copy3:
  3262.  move.w  (a4)+,(a5)+
  3263.  dbf     d4,copy3
  3264.  bra     here2
  3265. NotZero:
  3266.  movea.l MyVBR(pc),a4 ;if the VBR holds 0,then copy the original vectors in
  3267.  movea.l #0,a5      ;in its place
  3268.  move.l  #511,d4
  3269. copy4:
  3270.  move.w  (a4)+,(a5)+
  3271.  dbf     d4,copy4
  3272. here2:
  3273.  move.l  62(a7),d4
  3274.  add.l   #4,d4
  3275.  move.l  d4,62(a7)
  3276.  move.l  ExecBase,a6
  3277.  jsr     Permit(a6)
  3278.  movem.l (a7)+,d0-d7/a0-a6
  3279.  btst    #7,(a7)
  3280.  beq     NT210
  3281.  move.l  $24,-(a7)
  3282.  suba.l  #2,a7
  3283.  move.w  6(a7),(a7)
  3284.  bclr    #7,(a7)
  3285.  bset    #5,(a7)
  3286. NT210:
  3287.  rte
  3288.  
  3289.  
  3290. M_O_V_E_S:       ;Syntax:moves Rn,<ea> or moves <ea>,Rn
  3291.  movem.l (a7)+,d0-d7/a0-a6
  3292.  move.l  StackP(pc),-(a7)
  3293.  movem.l d0-d7/a0-a6,-(a7)
  3294.  move.l  66(a7),a0
  3295.  move.w  2(a0),d3
  3296.  btst    #11,d3
  3297.  beq     ea2Rn
  3298.  lea     MovSREf(pc),a3
  3299.  andi.w  #$f03f,(a3)
  3300.  move.w  (a0),d4
  3301.  andi.w  #$003f,d4
  3302.  move.w  d4,d3
  3303.  andi.w  #$7,d3
  3304.  andi.w  #$38,d4
  3305.  lsl.w   #7,d3
  3306.  lsl.w   #2,d3
  3307.  lsl.w   #3,d4
  3308.  or.w    d3,d4
  3309.  or.w    d4,(a3)
  3310.  move.w  (a0),d4
  3311.  andi.w  #$003f,d4
  3312.  lea     NumAdd(pc),a4
  3313.  move.l  #$4e714e71,4(a3)
  3314.  move.l  #4,(a4)
  3315.  cmpi.w  #$38,d4
  3316.  bne     MVS10
  3317.  move.w  4(a0),4(a3)
  3318.  move.l  #6,(a4)
  3319.  bra     EffFound
  3320. MVS10:
  3321.  cmpi.w  #$39,d4
  3322.  bne     MVS20
  3323.  move.l  4(a0),4(a3)
  3324.  move.l  #8,(a4)
  3325.  bra     EffFound
  3326. MVS20:
  3327.  andi.w  #$38,d4
  3328.  cmpi.w  #$28,d4
  3329.  bne     MVS30
  3330.  move.w  4(a0),4(a3)
  3331.  move.l  #6,(a4)
  3332.  bra     EffFound
  3333. MVS30:
  3334.  cmpi.w  #$30,d4    ;index
  3335.  bne     MVS40
  3336.  move.w  4(a0),d3
  3337.  btst    #8,d3
  3338.  beq     legalMoves1
  3339.  movem.l (a7)+,d0-d7/a0-a6
  3340.  adda.l  #4,a7
  3341.  movem.l d0-d7/a0-a6,-(a7)
  3342.  lea     BDFlag(pc),a3
  3343.  move.l  #0,(a3)
  3344.  lea     mvs11(pc),a3
  3345.  lea     Val2(pc),a4
  3346.  move.l  a3,(a4)
  3347.  lea     Offset(pc),a3
  3348.  move.l  #4,(a3)
  3349.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  3350. mvs11:
  3351.  movem.l (a7)+,d0-d7/a0-a6
  3352.  move.l  StackP(pc),-(a7)
  3353.  movem.l d0-d7/a0-a6,-(a7)
  3354.  lea     MovSREf(pc),a3
  3355.  andi.w  #$ffc0,(a3)
  3356.  ori.w   #$0039,(a3)
  3357.  move.l  RetAddr(pc),2(a3)
  3358.  move.l  62(a7),a0
  3359.  bra     EffFound
  3360. legalMoves1:
  3361.  movem.l (a7)+,d0-d7/a0-a6
  3362.  adda.l  #4,a7
  3363.  movem.l d0-d7/a0-a6,-(a7)
  3364.  lea     NumAdd(pc),a4
  3365.  move.l  #6,(a4)
  3366.  lea     BDFlag(pc),a3
  3367.  move.l  #0,(a3)
  3368.  lea     mvs21(pc),a3
  3369.  lea     Val2(pc),a4
  3370.  move.l  a3,(a4)
  3371.  lea     Offset(pc),a3
  3372.  move.l  #4,(a3)
  3373.  bra     BriefFormat   ;it is a 68020 addressing mode
  3374. mvs21:
  3375.  movem.l (a7)+,d0-d7/a0-a6
  3376.  move.l  StackP(pc),-(a7)
  3377.  movem.l d0-d7/a0-a6,-(a7)
  3378.  lea     MovSREf(pc),a3
  3379.  andi.w  #$ffc0,(a3)
  3380.  ori.w   #$0039,(a3)
  3381.  move.l  RetAddr(pc),2(a3)
  3382.  move.l  62(a7),a0
  3383.  bra     EffFound
  3384. MVS40:
  3385.  cmpi.w  #$28,d4
  3386.  bne     EffFound
  3387.  movem.l (a7)+,d0-d7/a0-a6
  3388.  adda.l  #4,a7
  3389.  movem.l d0-d7/a0-a6,-(a7)
  3390.  bra     illegale
  3391. EffFound:
  3392.  move.w  (a0),d3    ;first word in d3
  3393.  andi.w  #$00c0,d3     ;determine operation size (.B, .W or .L)
  3394.  lsr.w   #6,d3
  3395.  cmpi.w  #0,d3
  3396.  bne     wl
  3397.  move.w  #$1000,d2
  3398.  move.l  #24,d7    ;byte operation, so shift mem. loc. SaveVal, 24 bits
  3399.  bra     size1
  3400. wl:               ;Word or Long
  3401.  cmpi.w  #1,d3
  3402.  bne     l
  3403.  move.w  #$3000,d2
  3404.  move.l  #16,d7
  3405.  bra     size1
  3406. l:                 ;Long
  3407.  move.w  #$2000,d2
  3408.  move.l  #0,d7
  3409. size1:
  3410.  andi.w  #$cfff,(a3)
  3411.  or.w    d2,(a3)      ;set the size bits in the opcode
  3412.  move.w  2(a0),d3    ;second word in d3
  3413.  move.w  d3,d4
  3414.  andi.w  #$7000,d3
  3415.  lsr.w   #7,d3
  3416.  lsr.w   #5,d3
  3417.  mulu    #4,d3
  3418.  btst    #15,d4
  3419.  beq     DR
  3420.  add.l   #32,d3
  3421. DR:
  3422.  move.l  0(a7,d3),d1   ;d1 has the Rn contents
  3423.  tst.l   d7
  3424.  beq     NoSh
  3425.  lsl.l   d7,d1
  3426. NoSh:
  3427.  lea     SaveVal(pc),a3
  3428.  move.l  d1,(a3)
  3429.  lea     SaveA7(pc),a3
  3430.  move.l  a7,(a3)
  3431.  add.l   #4,(a3)
  3432.  movem.l (a7)+,d0-d7/a0-a6
  3433.  move.l  StackP(pc),a7
  3434. MovSREf:
  3435.  move.l  SaveVal(pc),d0   ;d0 will be replaced with the <ea>
  3436.  nop
  3437.  nop
  3438.  move.l  SaveA7(pc),a7
  3439.  adda.l  #60,a7
  3440.  movem.l d0-d7/a0-a6,-(a7)
  3441.  move.l  62(a7),d4
  3442.  add.l   NumAdd(pc),d4
  3443.  move.l  d4,62(a7)
  3444.  move.l  ExecBase,a6
  3445.  jsr     Permit(a6)
  3446.  movem.l (a7)+,d0-d7/a0-a6
  3447.  btst    #7,(a7)
  3448.  beq     NT220
  3449.  move.l  $24,-(a7)
  3450.  suba.l  #2,a7
  3451.  move.w  6(a7),(a7)
  3452.  bclr    #7,(a7)
  3453.  bset    #5,(a7)
  3454. NT220:
  3455.  rte
  3456.  
  3457.  
  3458. ea2Rn:
  3459.  lea     MovSEfR(pc),a3
  3460.  andi.w  #$ffc0,(a3)
  3461.  movea.l 66(a7),a0
  3462.  move.w  (a0),d4
  3463.  andi.w  #$003f,d4
  3464.  or.w    d4,(a3)
  3465.  lea     NumAdd(pc),a4
  3466.  move.l  #$4e714e71,2(a3)
  3467.  move.l  #4,(a4)
  3468.  cmpi.w  #$38,d4
  3469.  bne     MVS100
  3470.  move.w  4(a0),2(a3)
  3471.  move.l  #6,(a4)
  3472.  bra     EffFound2
  3473. MVS100:
  3474.  cmpi.w  #$39,d4
  3475.  bne     MVS200
  3476.  move.l  4(a0),2(a3)
  3477.  move.l  #8,(a4)
  3478.  bra     EffFound2
  3479. MVS200:
  3480.  andi.w  #$38,d4
  3481.  cmpi.w  #$28,d4
  3482.  bne     MVS300
  3483.  move.w  4(a0),2(a3)
  3484.  move.l  #6,(a4)
  3485.  bra     EffFound2
  3486. MVS300:
  3487.  cmpi.w  #$30,d4   ;index
  3488.  bne     MVS400
  3489.  move.w  4(a0),d3
  3490.  btst    #8,d3
  3491.  beq     legalMoves2
  3492.  movem.l (a7)+,d0-d7/a0-a6
  3493.  adda.l  #4,a7
  3494.  movem.l d0-d7/a0-a6,-(a7)
  3495.  lea     BDFlag(pc),a3
  3496.  move.l  #0,(a3)
  3497.  lea     ther11(pc),a3
  3498.  lea     Val2(pc),a4
  3499.  move.l  a3,(a4)
  3500.  lea     Offset(pc),a3
  3501.  move.l  #4,(a3)
  3502.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  3503. ther11:
  3504.  movem.l (a7)+,d0-d7/a0-a6
  3505.  move.l  StackP(pc),-(a7)
  3506.  movem.l d0-d7/a0-a6,-(a7)
  3507.  move.l  66(a7),a0
  3508.  lea     MovSEfR(pc),a3
  3509.  andi.w  #$ffc0,(a3)
  3510.  ori.w   #$0039,(a3)
  3511.  move.l  RetAddr(pc),2(a3)
  3512.  bra     EffFound2
  3513. legalMoves2:
  3514.  movem.l (a7)+,d0-d7/a0-a6
  3515.  adda.l  #4,a7
  3516.  movem.l d0-d7/a0-a6,-(a7)
  3517.  lea     NumAdd(pc),a4
  3518.  move.l  #6,(a4)
  3519.  lea     BDFlag(pc),a3
  3520.  move.l  #0,(a3)
  3521.  lea     ther21(pc),a3
  3522.  lea     Val2(pc),a4
  3523.  move.l  a3,(a4)
  3524.  lea     Offset(pc),a3
  3525.  move.l  #4,(a3)
  3526.  bra     BriefFormat   ;it is a 68020 addressing mode
  3527. ther21:
  3528.  movem.l (a7)+,d0-d7/a0-a6
  3529.  move.l  StackP(pc),-(a7)
  3530.  movem.l d0-d7/a0-a6,-(a7)
  3531.  move.l  66(a7),a0
  3532.  lea     MovSEfR(pc),a3
  3533.  andi.w  #$ffc0,(a3)
  3534.  ori.w   #$0039,(a3)
  3535.  move.l  RetAddr(pc),2(a3)
  3536.  bra     EffFound2
  3537. MVS400:
  3538.  cmpi.w  #$28,d4
  3539.  bne     EffFound2
  3540.  movem.l (a7)+,d0-d7/a0-a6
  3541.  adda.l  #4,a7
  3542.  movem.l d0-d7/a0-a6,-(a7)
  3543.  bra     illegale
  3544. EffFound2:
  3545.  move.w  (a0),d3    ;first word in d3
  3546.  andi.w  #$00c0,d3     ;determine operation size (.B, .W or .L)
  3547.  lsr.w   #6,d3
  3548.  cmpi.w  #0,d3
  3549.  bne     wl2
  3550.  move.w  #$1000,d2
  3551.  bra     size2
  3552. wl2:               ;Word or Long
  3553.  cmpi.w  #1,d3
  3554.  bne     l2
  3555.  move.w  #$3000,d2
  3556.  bra     size2
  3557. l2:                 ;Long
  3558.  move.w  #$2000,d2
  3559. size2:
  3560.  andi.w  #$cfff,(a3)
  3561.  or.w    d2,(a3)      ;set the size bits in the opcode
  3562.  move.w  2(a0),d3
  3563.  moveq   #0,d4
  3564.  btst    #15,d3
  3565.  beq     DR2
  3566.  move.w  #$0040,d4
  3567. DR2:
  3568.  andi.w  #$7000,d3
  3569.  lsr.w   #3,d3
  3570.  or.w    d3,d4
  3571.  andi.w  #$f03f,(a3)
  3572.  or.w    d4,(a3)
  3573.  lea     SaveA7(pc),a4
  3574.  move.l  A7,(a4)
  3575.  add.l   #4,(a4)
  3576.  movem.l (a7)+,d0-d7/a0-a6
  3577.  move.l  StackP(pc),a7
  3578. MovSEfR:
  3579.  move.l  d1,d0         ;d1 will be changed to <ea>.
  3580.  nop                   ;putting in a7 has no effect
  3581.  nop
  3582.  move.l  SaveA7(pc),a7
  3583.  adda.l  #60,a7
  3584.  movem.l d0-d7/a0-a6,-(a7)
  3585.  move.l  62(a7),d4
  3586.  add.l   NumAdd(pc),d4
  3587.  move.l  d4,62(a7)
  3588.  move.l  ExecBase,a6
  3589.  jsr     Permit(a6)
  3590.  movem.l (a7)+,d0-d7/a0-a6
  3591.  btst    #7,(a7)
  3592.  beq     NT230
  3593.  move.l  $24,-(a7)
  3594.  suba.l  #2,a7
  3595.  move.w  6(a7),(a7)
  3596.  bclr    #7,(a7)
  3597.  bset    #5,(a7)
  3598. NT230:
  3599.  rte
  3600.  
  3601.  
  3602. M_O_V_E_F_C_C_R:     ;Syntax: move CCR,<ea> = move CCR,d0 + move d0,<ea>
  3603.  move.l  62(a7),a0
  3604.  move.w  (a0),d1
  3605.  move.w  d1,d2
  3606.  andi.w  #$7,d1
  3607.  andi.w  #$38,d2
  3608.  lsl.w   #2,d1
  3609.  lsl.w   #7,d1
  3610.  lsl.w   #3,d2
  3611.  or.w    d2,d1
  3612.  lea     From(pc),a3
  3613.  lea     NumAdd(pc),a4
  3614.  move.l  #$4e714e71,4(a3)
  3615.  andi.w  #$f03f,(a3)
  3616.  or.w    d1,(a3)
  3617.  lsr.w   #6,d2
  3618.  cmpi.w  #$5,d2
  3619.  bne     tst2
  3620.  move.l  #4,(a4)       ;it is address reg. indirect with displ.
  3621.  move.w  2(a0),4(a3)
  3622.  bra     Here7
  3623. tst2:
  3624.  cmpi.w  #6,d2
  3625.  bne     tst3
  3626.  move.w  2(a0),d3    ;index
  3627.  btst    #8,d3
  3628.  beq     ccr12
  3629.  lea     BDFlag(pc),a3
  3630.  move.l  #0,(a3)
  3631.  lea     ccr11(pc),a3
  3632.  lea     Val2(pc),a4
  3633.  move.l  a3,(a4)
  3634.  lea     Offset(pc),a3
  3635.  move.l  #2,(a3)
  3636.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  3637. ccr11:
  3638.  move.w  60(a7),d0
  3639.  andi.l  #$ff,d0
  3640.  move.l  RetAddr(pc),a1
  3641.  move.w  d0,(a1)
  3642.  bra     EndMoveCCR
  3643. ccr12:
  3644.  lea     NumAdd(pc),a4
  3645.  move.l  #4,(a4)
  3646.  lea     BDFlag(pc),a3
  3647.  move.l  #0,(a3)
  3648.  lea     ccr21(pc),a3
  3649.  lea     Val2(pc),a4
  3650.  move.l  a3,(a4)
  3651.  lea     Offset(pc),a3
  3652.  move.l  #2,(a3)
  3653.  bra     BriefFormat    ;it is a 68020 addressing mode
  3654. ccr21:
  3655.  move.w  60(a7),d0
  3656.  andi.l  #$ff,d0
  3657.  move.l  RetAddr(pc),a1
  3658.  move.w  d0,(a1)
  3659.  bra     EndMoveCCR
  3660. tst3:
  3661.  lsr.w   #6,d1
  3662.  cmpi.w  #$7,d1
  3663.  bne     tst4
  3664.  move.l  #4,(a4)
  3665.  move.w  2(a0),4(a3)
  3666.  bra     Here7
  3667. tst4:
  3668.  cmpi.w   #$f,d1
  3669.  bne      tst5
  3670.  move.l   #6,(a4)
  3671.  move.l   2(a0),4(a3)
  3672.  bra      Here7
  3673. tst5:
  3674.  move.l   #2,(a4)
  3675. Here7:
  3676.  lea      SaveVal(pc),a4
  3677.  move.w   60(a7),d0
  3678.  andi.w   #$00ff,d0
  3679.  move.w   d0,(a4)
  3680.  lea      SaveA7(pc),a3
  3681.  move.l   a7,(a3)
  3682.  movem.l  (a7)+,d0-d7/a0-a6
  3683.  move.l   StackP(pc),a7
  3684. From:
  3685.  move.w  SaveVal(pc),d0
  3686.  nop
  3687.  nop
  3688.  move.l  SaveA7(pc),a7
  3689.  adda.l  #60,a7
  3690.  movem.l d0-d7/a0-a6,-(a7)
  3691. EndMoveCCR:
  3692.  move.l  62(a7),d4
  3693.  add.l   NumAdd(pc),d4
  3694.  move.l  d4,62(a7)
  3695.  move.l  ExecBase,a6
  3696.  jsr     Permit(a6)
  3697.  movem.l (a7)+,d0-d7/a0-a6
  3698.  btst    #7,(a7)
  3699.  beq     NT240
  3700.  move.l  $24,-(a7)
  3701.  suba.l  #2,a7
  3702.  move.w  6(a7),(a7)
  3703.  bclr    #7,(a7)
  3704.  bset    #5,(a7)
  3705. NT240:
  3706.  rte
  3707.  
  3708.  
  3709.  
  3710.  
  3711. BFCommon:               ;all the bit field instructions call this routine
  3712.  move.l  62(a7),a0      ;when they start executing.It gets the starting
  3713.  move.w  (a0),d1        ;address of the operand and also width and offset
  3714.  move.w  d1,d2          ;of the intended bitfield.if the operand is in a
  3715.  andi.w  #$3f,d1         ;data register, it is copied to a memory location
  3716.  lea     NumAdd(pc),a4   ;and it't address is passed. a flag is set to show
  3717.  lea     LEABF(pc),a3     ;this situation.
  3718.  move.l  #$4e714e71,2(a3)
  3719.  move.l  #4,(a4)
  3720.  andi.w  #$ffc0,(a3)
  3721.  or.w    d1,(a3)
  3722.  andi.w  #$38,d2
  3723.  bne     AddressInvolved
  3724.  move.w  d1,d2
  3725.  mulu    #4,d2
  3726.  move.l  0(a7,d2),d0
  3727.  lea     Val1(pc),a3
  3728.  move.l  d0,(a3)
  3729.  lea     Val1(pc),a4
  3730.  lea     SaveVal(pc),a3
  3731.  move.l  a4,(a3)
  3732.  moveq   #1,d7
  3733.  bra     bfEADone
  3734. AddressInvolved:
  3735.  cmpi.w  #$38,d1   ;imm. short
  3736.  bne     bflab10
  3737.  move.w  4(a0),2(a3)
  3738.  move.l  #6,(a4)
  3739.  bra     bfDone
  3740. bflab10:
  3741.  cmpi.w  #$39,d1    ;imm. long
  3742.  bne     bflab20
  3743.  move.l  4(a0),2(a3)
  3744.  move.l  #8,(a4)
  3745.  bra     bfDone
  3746. bflab20:
  3747.  cmpi.w  #$3a,d1     ;pc+displ
  3748.  beq     pcaddress
  3749.  cmpi.w  #$3b,d1
  3750.  bne     bflab30
  3751.  move.l  62(a7),a0
  3752.  move.w  4(a0),d3
  3753.  btst    #8,d3
  3754.  beq     pcaddress
  3755.  lea     BDFlag(pc),a3
  3756.  move.l  #1,(a3)
  3757.  lea     bf13(pc),a3
  3758.  lea     Val2(pc),a4
  3759.  move.l  a3,(a4)
  3760.  lea     Offset(pc),a3
  3761.  move.l  #4,(a3)
  3762.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  3763. bf13:
  3764.  lea     SaveVal(pc),a3
  3765.  move.l  RetAddr(pc),(a3)
  3766.  moveq   #0,d7
  3767.  bra     bfEADone
  3768. pcaddress:
  3769.  lea     NumAdd(pc),a4
  3770.  move.l  #6,(a4)
  3771.  lea     BDFlag(pc),a3
  3772.  move.l  #1,(a3)
  3773.  lea     bf23(pc),a3
  3774.  lea     Val2(pc),a4
  3775.  move.l  a3,(a4)
  3776.  lea     Offset(pc),a3
  3777.  move.l  #4,(a3)
  3778.  bra     BriefFormat       ;it is a 68020 addressing mode
  3779. bf23:
  3780.  lea     SaveVal(pc),a3
  3781.  move.l  RetAddr(pc),(a3)
  3782.  moveq   #0,d7
  3783.  bra     bfEADone
  3784. bflab30:
  3785.  andi.w  #$38,d1
  3786.  cmpi.w  #$28,d1    ;displ.
  3787.  bne     bflab40
  3788.  move.w  4(a0),2(a0)
  3789.  move.l  #6,(a4)
  3790.  bra     bfDone
  3791. bflab40:
  3792.  cmpi.w  #$30,d1   ;index
  3793.  bne     bfDone
  3794.  move.w  4(a0),d3
  3795.  btst    #8,d3
  3796.  beq     bf12
  3797.  lea     BDFlag(pc),a3
  3798.  move.l  #0,(a3)
  3799.  lea     bf11(pc),a3
  3800.  lea     Val2(pc),a4
  3801.  move.l  a3,(a4)
  3802.  lea     Offset(pc),a3
  3803.  move.l  #4,(a3)
  3804.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  3805. bf11:
  3806.  lea     SaveVal(pc),a3
  3807.  move.l  RetAddr(pc),(a3)
  3808.  moveq   #0,d7
  3809.  bra     bfEADone
  3810. bf12:
  3811.  lea     NumAdd(pc),a4
  3812.  move.l  #6,(a4)
  3813.  lea     BDFlag(pc),a3
  3814.  move.l  #0,(a3)
  3815.  lea     bf21(pc),a3
  3816.  lea     Val2(pc),a4
  3817.  move.l  a3,(a4)
  3818.  lea     Offset(pc),a3
  3819.  move.l  #4,(a3)
  3820.  bra     BriefFormat     ;it is a 68020 addressing mode
  3821. bf21:
  3822.  lea     SaveVal(pc),a3
  3823.  move.l  RetAddr(pc),(a3)
  3824.  moveq   #0,d7
  3825.  bra     bfEADone
  3826. bfDone:
  3827.  lea     SaveA7(pc),a3
  3828.  move.l  a7,(a3)
  3829.  movem.l (a7)+,d0-d7/a0-a6
  3830.  lea     savea1(pc),a7
  3831.  move.l  a1,(a7)
  3832.  move.l  StackP(pc),a7
  3833. LEABF:
  3834.  lea     (a1),a1     ;(a1) will be changed to <ea>
  3835.  nop
  3836.  nop
  3837.  lea      SaveVal(pc),a7
  3838.  move.l   a1,(a7)
  3839.  move.l   savea1(pc),a1
  3840.  move.l   SaveA7(pc),a7
  3841.  adda.l   #60,a7
  3842.  movem.l  d0-d7/a0-a6,-(a7)
  3843.  moveq    #0,d7
  3844. bfEADone:
  3845.  move.l   62(a7),a0
  3846.  move.w   2(a0),d1
  3847.  move.w   d1,d3
  3848.  btst     #11,d1
  3849.  beq      OffsetImm
  3850.  lsr.w    #6,d1
  3851.  andi.w   #$7,d1
  3852.  mulu     #4,d1
  3853.  move.l   0(a7,d1),d0  ;d0 has the offset
  3854.  lea      BFOffset(pc),a3
  3855.  move.l   d0,(a3)
  3856.  divs     #32768,d0
  3857.  move.w   d0,d1
  3858.  andi.l   #$ffff,d1
  3859.  muls     #4096,d1
  3860.  lsr.l    #8,d0
  3861.  lsr.l    #8,d0
  3862.  divs     #8,d0
  3863.  move.w   d0,d2
  3864.  andi.l   #$ffff,d2
  3865.  add.l    d2,d1      ;d1 has the number of bytes from the <ea>
  3866.  lsr.l    #8,d0
  3867.  lsr.l    #8,d0
  3868.  ext.l    d0
  3869.  tst.l    d0
  3870.  bpl      bfNoChange
  3871.  move.l   #8,d4
  3872.  add.l    d0,d4
  3873.  move.l   d4,d0
  3874.  sub.l    #1,d1
  3875. bfNoChange:
  3876.  move.l   d0,d2      ;d2 has the final offset
  3877.  bra      OffsetDone
  3878. OffsetImm:
  3879.  lsr.w    #6,d1
  3880.  andi.l   #$1f,d1
  3881.  lea      BFOffset(pc),a3
  3882.  move.l   d1,(a3)
  3883.  divu     #8,d1
  3884.  move.l   d1,d2
  3885.  andi.l   #$ffff,d1
  3886.  swap     d2
  3887.  andi.l   #$ffff,d2
  3888. OffsetDone:
  3889.  move.w   d3,d4
  3890.  btst     #5,d4
  3891.  beq      WidthImm
  3892.  andi.w   #$7,d4
  3893.  mulu     #4,d4
  3894.  move.l   0(a7,d4),d0
  3895.  andi.l   #$1f,d0       ;modulo 32
  3896.  bne      mod321
  3897.  move.l   #32,d0
  3898. mod321:
  3899.  move.l   d0,d4        ;d4 has the width
  3900.  bra      WidthDone
  3901. WidthImm:
  3902.  andi.l   #$1f,d4
  3903.  bne      WidthDone
  3904.  move.l   #32,d4
  3905. WidthDone:
  3906.  move.l   SaveVal(pc),a1
  3907.  adda.l   d1,a1 
  3908.              ;a1 points to the first byte containing the bit to manipulate
  3909.  move.l   Val3(pc),a3
  3910.  jmp      (a3)
  3911.  
  3912.  
  3913.  
  3914.  
  3915. PCRelative:                   ;<ea> = (d16,pc)
  3916.  move.l  62(a7),a0
  3917.  lea     PCRMove(pc),a3
  3918.  adda.l  d1,a0           ;a0 holds the pc that the assembler assumed at the
  3919.  move.w  (a0),2(a3)         ;time of assembly
  3920.  lea     SaveA7(pc),a3
  3921.  move.l  a7,(a3)
  3922.  lea     savea0(pc),a3
  3923.  move.l  a0,(a3)
  3924.  movem.l (a7)+,d0-d7/a0-a6
  3925.  lea     savea1(pc),a7
  3926.  move.l  a1,(a7)
  3927.  lea     saved0(pc),a7
  3928.  move.l  d0,(a7)
  3929.  move.l  savea0(pc),a1
  3930.  move.l  StackP(pc),a7
  3931. PCRMove:
  3932.  move.l  0(a1),d0
  3933.  nop
  3934.  lea     SaveVal(pc),a7
  3935.  move.l  d0,(a7)
  3936.  move.l  saved0(pc),d0
  3937.  move.l  savea1(pc),a1
  3938.  move.l  SaveA7(pc),a7
  3939.  adda.l  #60,a7
  3940.  movem.l d0-d7/a0-a6,-(a7)
  3941.  move.l  SaveVal(pc),d3
  3942.  move.l  Val3(pc),a3     ;ret addr
  3943.  jmp     (a3)
  3944.  
  3945.  
  3946.  
  3947. PCIndex:
  3948.  move.l  62(a7),a0
  3949.  adda.l  d1,a0
  3950.  move.w  (a0),d3
  3951.  btst    #8,d3
  3952.  beq     pcindexshort
  3953.  lea     BDFlag(pc),a3
  3954.  move.l  #1,(a3)
  3955.  lea     pc13(pc),a3
  3956.  lea     Val2(pc),a4
  3957.  move.l  a3,(a4)
  3958.  lea     Offset(pc),a3
  3959.  move.l  d1,(a3)
  3960.  bra     NEWADDRESSING   ;it is a 68020 addressing mode
  3961. pc13:
  3962.  move.l  RetAddr(pc),a1
  3963.  move.l  (a1),d3
  3964.  move.l  Val3(pc),a3
  3965.  jmp     (a3)
  3966. pcindexshort:
  3967.  lea     BDFlag(pc),a3
  3968.  move.l  #1,(a3)
  3969.  lea     pc23(pc),a3
  3970.  lea     Val2(pc),a4
  3971.  move.l  a3,(a4)
  3972.  lea     Offset(pc),a3
  3973.  move.l  d1,(a3)
  3974.  bra     BriefFormat   ;it is a 68020 addressing mode
  3975. pc23:
  3976.  move.l  RetAddr(pc),a1
  3977.  move.l  (a1),d3
  3978.  move.l  Val3(pc),a3
  3979.  jmp     (a3)
  3980.  
  3981.  
  3982.  
  3983.  
  3984. BriefFormat:                   ;<ea> = (d8,An,Xn*scale)
  3985.  movem.l (a7)+,d0-d7/a0-a6
  3986.  move.l  StackP(pc),-(a7)
  3987.  movem.l d0-d7/a0-a6,-(a7)
  3988.  move.l  66(a7),a0
  3989.  move.l  Offset(pc),d0
  3990.  move.l  BDFlag(pc),d1
  3991.  beq     BaseAddressingBrief
  3992.  adda.l  d0,a0
  3993.  move.l  a0,d6
  3994.  bra     BasePCDoneBrief
  3995. BaseAddressingBrief:
  3996.  move.w  (a0),d1
  3997.  andi.w  #$7,d1
  3998.  mulu    #4,d1
  3999.  add.l   #32,d1
  4000.  move.l  0(a7,d1),d6    ;d6 has base register
  4001.  adda.l  d0,a0
  4002. BasePCDoneBrief:
  4003.  move.w  (a0),d1
  4004.  move.w  d1,d2
  4005.  andi.w  #$7000,d1
  4006.  lsr.w   #7,d1
  4007.  lsr.w   #5,d1
  4008.  mulu    #4,d1
  4009.  btst    #15,d2
  4010.  beq     BriefData
  4011.  add.l   #32,d1
  4012. BriefData:
  4013.  move.l  0(a7,d1),d4   ;d4 has index register
  4014.  btst    #11,d2
  4015.  bne     BriefLong
  4016.  ext.l   d4
  4017. BriefLong:           ;now multiply the index
  4018.  move.w  d2,d1
  4019.  andi.w  #$0600,d1
  4020.  lsr.w   #7,d1
  4021.  lsr.w   #2,d1
  4022.  cmpi.w  #0,d1
  4023.  beq     BriefIndexDone
  4024.  cmpi.w  #1,d1
  4025.  bne     Mul4
  4026.  mulu    #2,d4
  4027.  bra     BriefIndexDone
  4028. Mul4:
  4029.  cmpi.w  #2,d1
  4030.  bne     Mul8
  4031.  mulu    #4,d4
  4032.  bra     BriefIndexDone
  4033. Mul8:
  4034.  mulu    #8,d4
  4035. BriefIndexDone:
  4036.  ext.w   d2       ;d2 has displacement
  4037.  ext.l   d2
  4038.  add.l   d2,d4     ;add them all
  4039.  add.l   d4,d6
  4040.  lea     RetAddr(pc),a3
  4041.  move.l  d6,(a3)
  4042.  movem.l (a7)+,d0-d7/a0-a6
  4043.  adda.l  #4,a7
  4044.  movem.l d0-d7/a0-a6,-(a7)
  4045.  move.l  Val2(pc),a3
  4046.  jmp     (a3)
  4047.  
  4048.    
  4049. NEWADDRESSING:
  4050.  movem.l (a7)+,d0-d7/a0-a6
  4051.  move.l  StackP(pc),-(a7)       ;insert a7
  4052.  movem.l d0-d7/a0-a6,-(a7)
  4053.  move.l  66(a7),a0
  4054.  move.l  Offset(pc),d0
  4055.  move.l  BDFlag(pc),d1
  4056.  beq     BaseAddressing
  4057.  adda.l  d0,a0
  4058.  move.l  a0,d6
  4059.  bra     BasePCDone
  4060. BaseAddressing:
  4061.  move.w  (a0),d1
  4062.  andi.w  #$7,d1
  4063.  mulu    #4,d1
  4064.  add.l   #32,d1
  4065.  move.l  0(a7,d1),d6   ;d6 has base register
  4066.  adda.l  d0,a0
  4067. BasePCDone:
  4068.  move.w  (a0),d1
  4069.  move.w  d1,d2
  4070.  btst    #7,d1
  4071.  beq     BaseDone
  4072.  moveq   #0,d6
  4073. BaseDone:
  4074.  moveq   #0,d5    ;d5 has index
  4075.  btst    #6,d1
  4076.  bne     IndexDone
  4077.  andi.w  #$7000,d1
  4078.  lsr.w   #7,d1
  4079.  lsr.w   #5,d1
  4080.  mulu    #4,d1
  4081.  btst    #15,d2         ;address or data register?
  4082.  beq     NAAddr
  4083.  add.l   #32,d1
  4084. NAAddr:
  4085.  move.l  0(a7,d1),d5
  4086.  btst    #11,d2
  4087.  bne     NALong
  4088.  ext.l   d5
  4089. NALong:
  4090.  move.l  d2,d1        ;now multipy index
  4091.  andi.w  #$0600,d1
  4092.  lsr.w   #7,d1
  4093.  lsr.w   #2,d1
  4094.  cmpi.w  #0,d1
  4095.  beq     IndexDone
  4096.  cmpi.w  #1,d1
  4097.  bne     Scale4
  4098.  mulu    #2,d5
  4099.  bra     IndexDone
  4100. Scale4:
  4101.  cmpi.w  #2,d1
  4102.  bne     Scale8
  4103.  mulu    #4,d5
  4104.  bra     IndexDone
  4105. Scale8:
  4106.  mulu    #8,d5
  4107.  
  4108. IndexDone:
  4109.  move.w  d2,d1
  4110.  andi.w  #$0030,d1
  4111.  lsr.w   #4,d1
  4112.  cmpi.w  #1,d1
  4113.  beq     BaseDispDone
  4114.  cmpi.w  #2,d1
  4115.  bne     LongDisp
  4116.  move.w  2(a0),d4     ;d4 has base displacement
  4117.  ext.l   d4
  4118.  add.l   #4,d0
  4119.  bra     BaseDispDone
  4120. LongDisp:
  4121.  move.l  2(a0),d4
  4122.  add.l   #6,d0
  4123.  
  4124. BaseDispDone:
  4125.  move.l  66(a7),a0
  4126.  add.l   d0,a0
  4127.  moveq   #0,d3     ;d3 has outer displacement
  4128.  move.w  d2,d1
  4129.  andi.w  #$7,d1
  4130.  btst    #6,d2
  4131.  bne     NoPrePost      ;it is not preindex or post index
  4132.  cmpi.w  #0,d1
  4133.  beq     AddrDone
  4134.  cmpi.w  #1,d1
  4135.  beq     CalPre
  4136. Case2:
  4137.  cmpi.w  #2,d1
  4138.  bne     Case3
  4139.  move.w  (a0),d3
  4140.  ext.l   d3
  4141.  add.l   #2,d0
  4142.  bra     CalPre
  4143. Case3:
  4144.  cmpi.w  #3,d1
  4145.  bne     Case4
  4146.  move.l  (a0),d3
  4147.  add.l   #4,d0
  4148.  
  4149. CalPre:              ;calculate pre index
  4150.  add.l   d4,d6
  4151.  add.l   d5,d6
  4152.  moveq   #0,d4
  4153.  moveq   #0,d5
  4154.  movea.l d6,a3
  4155.  move.l  (a3),d6
  4156.  add.l   d3,d6
  4157.  moveq   #0,d3
  4158.  bra     AddrDone     ;pre indexed address calculated
  4159.  
  4160. Case4:
  4161.  cmpi.w  #5,d1
  4162.  beq     CalPost
  4163.  cmpi.w  #6,d1
  4164.  bne     Case5
  4165.  move.w  (a0),d3
  4166.  ext.l   d3
  4167.  add.l   #2,d0
  4168.  bra     CalPost
  4169. Case5:
  4170.  move.l  (a0),d3
  4171.  add.l   #4,d0
  4172.  
  4173. CalPost:            ;calculate post index
  4174.  add.l   d4,d6
  4175.  move.l  d6,a3
  4176.  move.l  (a3),d6
  4177.  add.l   d5,d6
  4178.  moveq   #0,d4
  4179.  moveq   #0,d5
  4180.  add.l   d3,d6
  4181.  moveq   #0,d3
  4182.  bra     AddrDone   ;post indexed address calculated
  4183.  
  4184. NoPrePost:
  4185.  cmpi.w  #0,d1
  4186.  beq     AddrDone
  4187.  cmpi.w  #1,d1
  4188.  beq     AddrDone
  4189.  cmpi.w  #2,d1
  4190.  bne     Case6
  4191.  move.w  (a0),d3
  4192.  ext.l   d3
  4193.  add.l   #2,d0
  4194.  bra     AddrDone
  4195. Case6:
  4196.  move.l  (a0),d3
  4197.  add.l   #4,d0
  4198. AddrDone:
  4199.  add.l   d4,d5
  4200.  add.l   d5,d6
  4201.  add.l   d3,d6
  4202.  lea     RetAddr(pc),a3  ;this is the effevctive address.
  4203.  move.l  d6,(a3)
  4204.  lea     NumAdd(pc),a3    ;length of the instruction.
  4205.  move.l  d0,(a3)
  4206.  movem.l (a7)+,d0-d7/a0-a6
  4207.  adda.l  #4,a7
  4208.  movem.l d0-d7/a0-a6,-(a7)
  4209.  move.l  Val2(pc),a3
  4210.  jmp     (a3)
  4211.  
  4212.  
  4213.  
  4214. OldIllegalExcept:  dc.l 0
  4215. NewIllegalExcept:  dc.l 0
  4216. NewVec:            dc.l 0
  4217. Except:            dc.l 0
  4218. MyVBR:             dc.l 0
  4219. MySFC:             dc.l 0
  4220. MyDFC:             dc.l 0
  4221. MyCAAR:            dc.l 0
  4222. MyCACR:            dc.l 0
  4223. MySR:              dc.w 0
  4224. MySP:              dc.l 0
  4225. SaveVal:           dc.l 0
  4226. RetAddr:           dc.l 0
  4227. savea0:            dc.l 0
  4228. savea1:            dc.l 0
  4229. saved1:            dc.l 0
  4230. saved0:            dc.l 0
  4231. savereg:           dc.l 0
  4232. SaveA7:            dc.l 0
  4233. NumAdd:            dc.l 0   ;NumAdd holds the instruction length
  4234. StackP:            dc.l 0
  4235. Val1:              dc.l 0
  4236. Val2:              dc.l 0
  4237. Val3:              dc.l 0
  4238. WhichOne:          dc.l 0
  4239. Flag:              dc.l 0
  4240. Offset:            dc.l 0
  4241. BDFlag:            dc.l 0
  4242. BFOffset           dc.l 0
  4243.  
  4244.  
  4245. EndIllegal:
  4246.  end
  4247.  
  4248.